[当使用python逆〜时,似乎这些位并没有像我期望的那样翻转。我相信困惑在于我对python如何使用2的恭维存储数字的理解。
myInt = 5 #101
inverse = ~myInt
print(bin(inverse))
输出:-0b110
预期:-0b010或-0b10
这与two's complement用于编码负数的方式有关。通过反转数字并加一个来计算任何整数的负表示。
如果翻转该逻辑,则反转二进制表示形式将取反该值并减去一个。因此5的倒数确实应该是-6。
~5
# -6
由于Python没有为每个整数使用固定数量的位,因此无法显示所有的前导零(有无限数)。因此,前面是负号,-0b110
代表-6
。
选择任意固定数目的位,您可以写入不带负数的二进制数。例如,使用8位(一个字节),它将是1111 1010
,这是您期望的逆数。
由于Python签名了任意大小的整数,因此从概念上讲,它们会被符号扩展为无穷大。当我们将位0b101
取反时,确实得到0b010
,但是符号扩展名也被翻转了:数字以1
s而不是0
s的无穷大开始。并且此1111111....1010
值等于-6,而不是-2-因为全为1,然后我们将4位和1位删除。
[通常,Python整数的~x
等于-x - 1
(等效为-(x+1)
)。对于Python代码,这很少是有用的操作,但您永远不知道:)