记录一些知识点
一、各类型最大值、最小值…
在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