Python位运算符 ~
反转整数的所有位,但是我们无法看到原生结果,因为Python中的所有整数都具有有符号的表示形式。
间接地,我们可以检查:
>>> a = 65
>>> a ^ ~a
-1
或者同样的:
>>> a + ~a
-1
结果为-1表示所有位都被设置。但负号不允许我们直接检查这个事实:
>>> bin(-1)
'-0b1'
解决方法很简单:我们必须使用无符号整数。第一种方式是导入
numpy
或
ctypes
模块,两者都支持无符号整数。但是对于我来说,numpy比ctypes更简单易用:
import numpy as np
a = np.uint8(0b1100)
y = ~x
检查结果:
>>> bin(x)
'0b1100'
>>> bin(y)
'0b11110011'
最后进行检查:
>>> x + y
255
对于8位整数(字节),无符号整数'255'与有符号整数'-1'的含义相同,因为它们所有的位都被设置为1。请确保:
>>> np.uint8(-1)
255
还有一种最简单的解决方案,虽然不是非常正确,但如果你想要包含额外的模块,你可以使用异或运算来反转所有位,其中第二个参数的所有位都设置为1:
a = 0b1100
b = a ^ 0xFF
执行此操作还将删除有符号整数的最高有效位,我们可以看到以下结果:
>>> print('{:>08b}'.format(a))
00001100
>>> print('{:>08b}'.format(b))
11110011
最终的解决方案包含了一项额外的操作,因此并不是最优的:
>>> b = ~a & 0xFF
>>> print('{:>08b}'.format(b))
11110011
0b0
,而是False
单例对象,因为not
始终返回其操作数的相反值(无论是什么),这是由其真实性确定的。 - Bachsau