按位操作一元〜(反转)
我有点困惑~
运算符。 代码如下:
a = 1 ~a #-2 b = 15 ~b #-16
~
如何工作?
我以为, ~a
会是这样的:
0001 = a 1110 = ~a
为什么不?
你完全正确。 这是二进制补码整数表示的一个产物。
在16位中,1表示为0000 0000 0000 0001
。 反过来,你得到1111 1111 1111 1110
,这是-2。 同样,15是0000 0000 0000 1111
。 反过来,你得到1111 1111 1111 0000
,这是-16。
一般来说, ~n = -n - 1
'〜'运算符定义为:“x的位反转定义为 – (x + 1),它只适用于整数。 Python文档 – 5.5
这句话的重要部分是这与“整数”(也称为整数)有关。 你的例子表示一个4位数字。
'0001' = 1
4位数的整数范围是'-8..0..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
您也可以使用未签名的整数(例如numpy包)来实现预期的行为。
>>> import numpy as np >>> bin( ~ np.uint8(1)) '0b11111110'
它看起来像我find更简单的解决scheme,做什么是理想的:
uint8: x ^ 0xFF<br> uint16: x ^ 0xFFFF<br> uint32: x ^ 0xFFFFFFFF<br> uint64: x ^ 0xFFFFFFFFFFFFFFFF