位运算基本符号:
& 按位与 &= 按位与赋值
| 按位或 |= 按位或赋值
^ 按位异或 ^= 按位异或赋值
<< 左移 <<= 左移赋值
>> 右移 >>= 右移赋值
~ 按位取反
1. 按位与运算
左右操作数对应的每一位分别做逻辑与运算
10 0 0 0 0 1 0 1 0
29 0 0 0 1 1 1 0 1
10&29 0 0 0 0 1 0 0 0
值8
2. 按位或运算
左右操作数对应的每一位分别做逻辑或运算
10 0 0 0 0 1 0 1 0
29 0 0 0 1 1 1 0 1
10|29 0 0 01 1 1 1 1
值为31
3. 按位异或运算
当左右操作数对应位不相同,位操作的结果才为1
10 0 0 0 0 1 0 1 0
29 0 0 0 1 1 1 0 1
10^29 0 0 01 0 1 1 1
值为23
4. 左移
按右操作数指定位数,将左操作数按位向左移动,腾空数位补0
10<<2 00001010<<2
40 00101000
C++进行算术左移时,不会移动符号位
对于一个整数,每左移一位就相当于乘以2
5. 右移
按右操作数指定位数,将左操作数按位向右移动
12>>2 00001100>>2
3 00000011
做算术右移时,不会移动符号位(左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;)
对于一个整数,每右移一位就相当于整除以2
6. 按位取反
单目运算。对操作数按位做逻辑非
-11 11110101
负数在计算机中用补码表示。11110101是-11的补码
7. 位运算的复合赋值
位运算的5个复合赋值与其他复合赋值的操作形式一致
例如,若有
int a, b ;
则 a&=b 等价于 a=a&b
a|=b 等价于 a=a|b
a^=b 等价于 a=a^b
a<<=b 等价于 a=a<<b
a>>=b 等价于 a=a>>b