位运算需要将源码转换成补码再运算,运算结束后再转成源码,才是结果
源码和补码转换规则:
- 正数
源码转补码:结果是正数本身
补码转源码:结果是正数本身
- 负数
源码转补码:符号位不变,其它位取反,然后加一
补码转源码:符号位不变,其它位取反,然后加一
---------------------
举例:
正数 2
源码 0000 0010
补码 0000 0010
===========
2 位非运算 ~2
转成补码运算
补码 0000 0010
运算:1111 1101 (每个位置数值都取反)
转成源码:因为结果是负数,符号位不变,其它位取反
1000 0010 加一 1000 0011
所以 ~2 = -3
===========
-3 的位非运算 ~-3
源码 1000 0011
转成补码:符号位不变,其它位取反 1111 1100 加一 1111 1101
即补码 1111 1101
运算: 0000 0010(每个位置数值都取反)
转成源码:0000 0010
所以 ~-3 = 2
================
位或运算 2 | -3
源码 0000 0010 | 1000 0011
补码 0000 0010 | 1111 1101
运算 1111 1111(相同位置数值都为0时取0,否则取1)
转成源码 ->1000 0000 -> 1000 0001
所以 2 | -3 = -1
================
位与运算 2 & -3
源码 0000 0010 & 1000 0011
补码 0000 0010 & 1111 1101
运算 0000 0000(相同位置数值都为1时取1,否则取0)
转成源码 ->0000 0000
所以 2 & -3 = 0
===============
位异或运算 2 ^ -3
源码 0000 0010 ^ 1000 0011
补码 0000 0010 ^ 1111 1101
运算 1111 1111(相同位置数值不同取1,否则取0)
转成源码 -> 1000 0000 -> 1000 0001
所以 2 ^ -3 = -1
===============
-15 >> 2
源码 1000 1111 >> 2
补码 1111 0001 >> 2
移动 1111 1100 (负数右移时左边补1)
转成源码 -> 1000 0011 -> 1000 0100 (10进制-4)
所以 -15 >> 2= -4
其它位运算,规则相同