位运算共有四种'&'、'|'、'~'和'^'
都以A=60,B=30为例
&:按位与操作,按二进制位进行与运算。
A:0011 1100
B:0001 1110
&:0001 1100 //即A&B:28
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1(一个为假,则为假)
|:按位或运算。
A:0011 1100
B:0001 1110
|:0011 1110//即A|B:62
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1(都为假时为假)
~:取反运算符。
A: 0011 1100
~:1100 0011//即~A:-61
这里负数涉及涉及原码、补码反码的转换。
运算规则:~1=0; ~0=1
^:异或运算符。
A:0011 1100
B:0001 1110
^:0010 0010//即A^B:34
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0(一真一假时为真)
位运算符的应用:
- 判断偶数
if(x&1)
printf("是奇数");
else
printf("是偶数");
/*以x=8为例
x:0000 1000
1:0000 0000
&:0000 0000
所以x&1=0为偶数
若x=3
x:0000 0011
&:0000 0001
则x&1=1为奇数
*/
- 不使用中间变量交换两个整型的变量
int a=3,b=5;//a=0000 0011 b=0000 0101
a=a^b;//a=0000 0110
b=a^b;//b=0000 0011
a=a^b;//a=0000 0101
/*a b和a^b有个规律任何两个异或可以得到另一个数,所以只要一直保持其中两个已知就可以得到另一
个数,用a储存了a^b,则可以用现在的a去与b异或,则b变成了a,再与b异或就得到了a*/
注:
<<:左移运算符,左移n位等价与乘以2的n次方(注意溢出)
>>:右移运算符,右移等价于除于2的n次方(右移左边补符号位,正数补0,负数补1)