位运算就是对整数补码的各位上进行变换运算。
计算机对数的运算都是针对补码的,计算完后再得出原码。
*这里暂且视int类型为4字节,即32位。
原码:
二进制数,如:7->0000000 0000000 00000000 00000111
-9->1000000 0000000 00000000 00001001
反码:
正数:与原码相同
负数:符号位(第一位)不变,其他位取反,1->0,0->1
如:7->0000000 0000000 00000000 00000111
-9->11111111 11111111 11111111 11110110
补码:
正数:与原码相同
负数:反码+1
如:7->0000000 0000000 00000000 00000111
-9->11111111 11111111 11111111 11110111
*运算结束后,如果是负数(符号位为1),则要将补码转换成原码,再得到十进制数。
结果为正数则:原码=反码=补码
1.与运算(&)双目运算符
将两个数的补码每一位对比,都为1,则为1,否则为0。
7&-9=?
7->补码=0000000 0000000 00000000 00000111(正数,补码与原码相同)
-9->补码=11111111 11111111 11111111 11110111(负数,反码+1)
7&-9 补码= 00000000 00000000 00000000 00000111(正数,原=反=补)
所以 7&-9=7
2.非运算(~)单目运算符
将该数的补码按位取反。
~5=?
5->补码=反码=原码=00000000 00000000 00000000 00000101
~5->补码=11111111 11111111 11111111 11111010
->反码=11111111 11111111 11111111 11111001(补码-1)
->反码=10000000 00000000 00000000 00000110
所以 ~5=-6
2.非运算(|)双目运算符
将两个数的补码每一位对比,一个或两个为1则为1,否则为零。
7|-8=?
7->补码=0000000 0000000 00000000 00000111(正数,补码与原码相同)
-8->补码=11111111 11111111 11111111 11111000(负数,反码+1)
7|-8 ->补码=11111111 11111111 11111111 11111111
->反码=11111111 11111111 11111111 11111110
->原码=1000000 0000000 00000000 00000001
所以 7|-8=-1