位运算过程
位运算符是对二进制数进行操作。在 Python 中,位运算的过程为:输入数值 -> 原码 -> 补码 -> 位运算 -> 补码 -> 原码 -> 显示数值。我们用位运算符对数值进行位运算,实际上是对该数值的补码进行位运算。位运算的结果仍然是补码,显示该数值时需系统会先转化为原码,然后得出对应的数值。
位运算例子
- 二进制与二进制位运算
print(-0b0110 & 0b1111)
输出结果为:10
解释:
-0b0110
原码为-0110
,因为是负数,所以补码为11010
(添加一位表示符号)。而 0b1111
原码为 01111
(添加一位表示符号),因为是正数,补码和原码相同,补码为01111
。两者的补码进行 与
运算,得到结果 01010
,并且结果仍是补码。输出显示时,系统会将该补码转化为原码,然后得到真实数值。该补码 01010
为正数*(最高位为符号位),所以原码也为 01010
(最高位为符号位),解析为十进制,即得到 10。
倘若两个数位数不一样长,如 -0b0110 & 0b11111
,第一个负数长度为 4,而第二个正数长度为 5。那么在进行为运算时,要先使两者长度一致,即在长度较短的那个数前面补 0。则,第一个负数补一个 0 变为 00110
。最后,两个数都在前面添加一个符号位。第一个数为负数,求补得到 111010
。第二个数为正数,求补不变。所以,此时位运算为 111010 & 011111
。符号位也要参与位运算,得到的结果就是 011010
。输出显示时,系统会将该补码转化为原码,然后得到真实数值。该补码 011010
为正数(最高位为符号位),所以原码也为 011010
(最高位为符号位),解析为十进制,即得到 26。
- 二进制与十进制位运算
print(-0b0110 & 15)
输出结果:10
解释:十进制数 15
的原码为 01111
(添加一位表示符号),其余过程同第一个例子,不再赘述。
- 二进制与十六进制位运算
print(-0b0110 & 0x0F)
输出结果:10
解释:十六进制数 0x0F
的原码为 01111
(添加一位表示符号),其余过程同第一个例子,不再赘述。
- 十进制与十进制位运算
print(-6 & 15)
输出结果:10
- 十进制与十六进制位运算
print(-6 & 0x0F)
输出结果:10
- 十六进制与十六进制位运算
print(-0x6 & 0xF)
输出结果:10
位运算符号
位运算符 | 功能 |
---|---|
<< | 按位左移,左移n位相当于乘以2的n次方 |
>> | 按位右移 ,左移n位相当于除以2的n次方 |
& | 按位与,如果两个相应的二进制位都为 1,则该位的结果值为 1;否则为 0。 |
l | 按位或 ,两个相应的二进制位中只要有一个为 1,该位的结果值为 1;否则为 0。 |
^ | 按位异或 ,若参加运算的两个二进制位同号则结果为0,异号则结果为1 |
~ | 按位取反,用来对一个二进制数按位取反,即将0变1,将1变0。 |