位运算
1.按位取反 ~
int a = 2; //0000 0000 0000 0000 0000 0000 0000 0010
printf("~a = :%d\n",~a); //1111 1111 1111 1111 1111 1111 1111 1101 打印输出时 会转换储存码(计算机认为默认保存的为反码)
//转换为1000 0000 0000 0000 0000 0000 0000 0010 + 1 打印输出
2.按位与 &
- 同真为真 其余为假
1111 0000
1010 1010
&
1010 0000
3.按位或 |
- 同假为假 其余为真
1111 0000
1010 1010
|
1111 1010
4.按位异或 ^
- 不同为真 相同为假
1111 0000 X
1010 1010 Y
|
0101 1010 Z
Z = X^Y
X=Z^Y
Y=Z^X
5.左移运算符 <<
0000 0001 1 << 1
0000 0010 2 << 1
0000 0100 4 << 3
0010 0000 32
左移相同于 变量*(2^n)
6.右移运算符
0010 0000 32 >> 2
0000 1000 8
右移相同与 变量/(2^n)
- 注意,对于无符号数,右移后,空位由0填充
- 对于有符号数,右移后,空位可能由1,也可能由0填充…根据机器