C++ 提供了按位与(&)、按位或(| )、按位异或(^)、取反(~)、左移(<<)、右移(>>)这 6 种位运算符。 这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char、short、int 与 long 类型。
另,负数按补码形式参加按位与运算。
1、按位与运算符(&)
“a&b”是指将参加运算的两个整数a和b,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 0000 0001 因此,3&5的值得1。
2、按位或运算符(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。
3、按位异或运算符(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0 ^ 0=0; 0 ^ 1=1; 1^ 0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
如果是负数:
0000 0101 (5)
^ 1111 1101 (-3)
1111 1000 (结果)
4、按位取反运算符(~)
按位取反运算符(~)是指将整数的各个二进制位都取反,即1变为0,0变为1。
例如,~9=-10,因为9(00001001)所有位取反即为(11110110),这个数最高位是1,所以是补码。补码还原成反码(反码等于补码减1)得到(11110101),再还原为原码(反码到原码最高位不变,其它各位取反)等于(10001010), 十进制为-10。
5、按位左移运算符(<<)
左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
在高位没有1的情况下,左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。
但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
例如:143<<2 结果为60 因为143转换为进制为10001111,左移2得00111100 ,结果为60。
6、按位右移运算符(>>)
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,用符号位填补(即“算术移位”)。
注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。
如果符号位原来为1(即负数),则右边移入还是1。
左移运算一律在右端补0,右移运算一律在左端补符号数(负数符号位为1就补1,正数符号位为0就补0)
7、复合赋值运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
1、&= 例:a &=b 相当于a=a& b
2、|= 例:a |=b 相当于a=a |b
3、>>= 例:a >>=b 相当于a=a>> b
4、<<= 例:a<<=b 相当于a=a<< b
5、^= 例:a ^= b 相当 a=a ^b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int main() { int a=3; // 0000 0011 printf("%d\n",a); a=a>>1; //右移动一个单位 0000 0001 printf("%d\n",a); a=a<<2; //左移动一个单位 0000 0100 printf("%d\n",a); a=~a; //补码1111 1011 反码1111 1010 10000101 printf("%d\n",a); int b=5,c=3; //0000 0101 00000100 printf("%d\n",b&c); //与运算 printf("%d\n",b|c); //或运算 return 0; } |