C++ 类型最大值(最小值)、按位运算符

记录一些知识点


一、各类型最大值、最小值…

  在C/C++中,如何得到int(或其他类型)的最大值,最小值?以下有三种方法可供使用。

  • [1].limits.h/climits中,定义了INT_MAX,INT_MIN…,可以直接使用
#include <climits>

int main() {
    
    
    cout << "CHAR_MIN:" << CHAR_MIN << endl;
    cout << "UCHAR_MAX:" << UCHAR_MAX << endl;

    cout << "SHRT_MAX:" << SHRT_MAX << endl;
    cout << "INT_MAX:" << INT_MAX << endl;
    cout << "LONG_MAX:" << LONG_MAX << endl;
    cout << "LONG_MIN:" << LONG_MIN << endl;
    
    cout << "..." << endl;

    return 0;
}
  • 输出结果为:
CHAR_MIN:-128
UCHAR_MAX:255
SHRT_MAX:32767
INT_MAX:2147483647
LONG_MAX:9223372036854775807
LONG_MIN:-9223372036854775808
...

  • [2]. 通过二进制方法操作: int 包含32二进制位,第一位正负号,剩下31位表示数字大小.
int main() {
    
    
    int num_int_max = pow(2,31)-1; 
    cout << "num:" << num_int_max << endl; 	// num:2147483647

    double num_int_min = num_int_max+1;
    cout << "num:" << num_int_min << endl; 	// num:-2.14748e+09
    
    return 0;
}

  • [3]. 通过求反运算符操作: int 包含32二进制位,将每一位转换为它的反面(0转换为1,1转换为0).
int main() {
    
    
    unsigned int zero = 0;
    cout << "num:" << ~zero/2 << endl; // num:2147483647
    return 0; 
}

   以上三种方法对于求任意类型的最大最小值都适用。


二、按位运算符

1.位移运算符 "<<" , ">>"

  • 按位运算符对整数值进行操作.
  • <1>. 左移运算符"<<" ,语法如下:
// value << shift	
13 << 3
  • 其中,value为被操作的整数值,shift是要移动的数位。上述代码将13的所有位都向左移动三位。
  • 移动过程中,腾出来的位置用0填充,超出边界的位被丢弃。
  • 左移一位相当于乘以2, 左移n位相当于乘以2^n
  • 左移运算符不会修改value的值,如果需要用左移运算符改变变量值,还需使用赋值运算符
    int num = 13 << 3;
    cout << "num:" << num << endl; // num:104, 13*(2^3)=13*8=104

  • <2>. 同上,右移运算符">>" ,语法如下:
	// value >> shift	
	int num = 17 >> 3;
    cout << "num:" << num << endl; // num:2, 17:0001 0001--> 2:0000 0010
  • 其中,value为被操作的整数值,shift是要移动的数位。上述代码将17的所有位都向右移动三位。
  • 移动过程中,腾出来的位置用0填充,超出边界的位被丢弃。
  • 右移一位相当于除以2, 除移n位相当于除以2^n
  • 如果需要用除移运算符改变变量值,还需使用赋值运算符

2.逻辑按位运算符"~" , "|", "&" , "^"

  逻辑按位运算符类似于常规运算符,只是他们用于值的每一位

  • <1>. 位非(求反)运算符"~"
  • 常规非运算符"!"与将true(或非零值)转换为false,将false转换为true。
  • ~运算符将每一位转换为它的反面(0转换为1,1转换为0)。
    unsigned char x = 3;
    
    cout << "!x: " << !x << endl;	// !x: 0

    x = ~x;
    cout << "~x: " << static_cast<unsigned>(x) << endl;	// ~x: 252

   上述代码中,x的二进制形式:0000 0011,将0转换为1,1转换为0得1111 1100,在十进制中,为252,新值是原值的补值。

  • <2>. 按位运算符or"|"与and"&"
  • |运算符对两个整数进行操作,生成一个新值,如果被操作的两个值的对应位至少有一个为1,则新值相应位置为1,否则为0。
  • &运算符对两个整数进行操作,生成一个新值,如果被操作的两个值的对应位都为1,则新值相应位置为1,否则为0。
    int num_a = 4;  // 0000 0100
    int num_b = 1;  // 0000 0001

    int a_or_b = num_a|num_b;
    cout << "|: " << a_or_b << endl;    // |: 5, 0000 1001

    int a_and_b = num_a&num_b;
    cout << "&: " << a_and_b << endl;   // &: 0
  • 此外,|=&= 组合了按位运算符与赋值运算符的功能
    int num_a = 4;  // 0000 0100
    int num_b = 1;  // 0000 0001

    num_a |= num_b;
    cout << "|: " << num_a << endl;    // a=5, 0000 1001

    num_a &= num_b;
    cout << "&: " << num_a << endl;   // a=5&1=1

  • <3>. 按位运算符XOR"^"
  • ^运算符对两个整数进行操作,生成一个新值。
  • 如果被操作的两个值的对应位有一个为1(而不是两个),则新值相应位置为1
  • 如果对应的位都为0或1,则新值相应位置为0
  • ^= 组合了按位运算符与赋值运算符的功能
    int num_a = 5;  // 0000 0101
    int num_b = 1;  // 0000 0001

    num_a ^= num_b;
    cout << "^: " << num_a << endl;  // ^: 4, 0000 0100

猜你喜欢

转载自blog.csdn.net/u013271656/article/details/113309501