位运算一元 ~(取反)
我对~
这个运算符有点困惑。下面是代码:
a = 1
~a #-2
b = 15
~b #-16
那~
到底是怎么工作的呢?
我原以为~a
会像这样:
0001 = a
1110 = ~a
为什么不是呢?
6 个回答
28
看起来我找到了一个更简单的解决方案,可以实现想要的效果:
uint8: x ^ 0xFF
uint16: x ^ 0xFFFF
uint32: x ^ 0xFFFFFFFF
uint64: x ^ 0xFFFFFFFFFFFFFFFF
38
‘~’这个符号的意思是:对一个数字进行按位取反,计算方式是-(x+1)。这个操作只适用于整数。
这里面最重要的是,它跟“整数”有关,也就是我们常说的整数字。你给的例子是一个4位的数字。
'0001' = 1
4位数字的整数范围是从-8到7。另一方面,如果你使用“无符号整数”,也就是不包括负数,那么4位数字的范围就是0到15。
因为Python处理的是整数,所以你描述的行为是正常的。整数是用二进制补码来表示的。对于4位数字,它的表示方式如下。
7 = '0111'
0 = '0000'
-1 = '1111'
-8 = '1000'
在32位操作系统上,Python使用32位来表示整数。你可以用下面的代码来查看最大的整数:
sys.maxint # (2^31)-1 for my system
如果你想要得到一个无符号的4位数字,你需要进行掩码处理。
'0001' = a # unsigned '1' / integer '1'
'1110' = ~a # unsigned '14' / integer -2
(~a & 0xF) # returns 14
如果你想得到一个无符号的8位数字范围(0到255),只需要使用:
(~a & 0xFF) # returns 254
77
你说得完全正确。这是因为使用了二进制补码来表示整数。
在16位的情况下,数字1的表示是0000 0000 0000 0001
。如果把它反转,就变成1111 1111 1111 1110
,这个值是-2。同样,数字15的表示是0000 0000 0000 1111
,反转后变成1111 1111 1111 0000
,这个值是-16。
一般来说,~n = -n - 1
。