将两个操作数各个对应位都进行逻辑与运算
x = 3 & 5
| 十进制操作数 | 八位二进制码 |
|---|---|
| 3 | 0 0 0 0 0 0 1 1 |
| 5 | 0 0 0 0 0 1 0 1 |
| 3 & 5 == 1 | 0 0 0 0 0 0 0 1 |
可用于在操作数一些位不变的情况下,将其他位置为0(任意值与1相与后不变,与0相与后为0) 2.按位或(|)
将两个操作数各个对应位都进行逻辑或运算
x = 3 | 5
| 十进制操作数 | 八位二进制码 |
|---|---|
| 3 | 0 0 0 0 0 0 1 1 |
| 5 | 0 0 0 0 0 1 0 1 |
| 3 | 5 == 7 | 0 0 0 0 0 1 1 1 |
可用于在操作数一些位不变的情况下,将其他位置为1(任意值与0相或后不变,与1相或后为1) 3.按位异或(^)
将两个操作数各个对应位都进行异或运算异或运算:对应位相同则异或得0,对应位不同则异或得1
x = 3 ^ 5
| 十进制操作数 | 八位二进制码 |
|---|---|
| 3 | 0 0 0 0 0 0 1 1 |
| 5 | 0 0 0 0 0 1 0 1 |
| 3 ^ 5 == 6 | 0 0 0 0 0 1 1 0 |
可用于将操作数的指定位取反(任意值与0异或后不变,与1异或后取反) 4.按位取反(~)
对操作数的每一位都取反
| 十进制操作数 | 八位二进制码 | 原码 |
|---|---|---|
| 5 | 0 0 0 0 0 1 0 1 | 0 0 0 0 0 1 0 1 |
| ~5 == -6 | 1 1 1 1 1 0 1 0 | 1 0 0 0 0 1 1 0 |
注: 在C++中,定点数以补码的形式保存
5.移位运算(<<、>>)左移(<<)
左移后,低位补0,高位舍去,可能导致溢出
int a = -8; a = a << 2;
| 十进制操作数 | 八位二进制码 | 原码 |
|---|---|---|
| -8 | 1111 1000 | 1000 1000 |
| -8 << 2 == -32 | 1110 0000 | 1010 0000 |
右移(>>)
右移后,低位舍去,高位补符号位,可能导致精度损失
int a = -8; a = a >> 2;
| 十进制操作数 | 八位二进制码 | 原码 |
|---|---|---|
| -8 | 1111 1000 | 1000 1000 |
| -8 >> 2 == -2 | 1111 1110 | 1000 0010 |


![[C++] 位运算 [C++] 位运算](http://www.mshxw.com/aiimages/31/743576.png)
