Python逐位逆不翻转位

问题描述 投票:0回答:2

[当使用python逆〜时,似乎这些位并没有像我期望的那样翻转。我相信困惑在于我对python如何使用2的恭维存储数字的理解。

myInt = 5 #101
inverse = ~myInt
print(bin(inverse))

输出:-0b110

预期:-0b010或-0b10

python bit
2个回答
1
投票

这与two's complement用于编码负数的方式有关。通过反转数字并加一个来计算任何整数的负表示。

如果翻转该逻辑,则反转二进制表示形式将取反该值并减去一个。因此5的倒数确实应该是-6。

~5                                                                                                                                                                                                                                  
# -6

由于Python没有为每个整数使用固定数量的位,因此无法显示所有的前导零(有无限数)。因此,前面是负号,-0b110代表-6

选择任意固定数目的位,您可以写入不带负数的二进制数。例如,使用8位(一个字节),它将是1111 1010,这是您期望的逆数。


0
投票

由于Python签名了任意大小的整数,因此从概念上讲,它们会被符号扩展为无穷大。当我们将位0b101取反时,确实得到0b010,但是符号扩展名也被翻转了:数字以1 s而不是0 s的无穷大开始。并且此1111111....1010值等于-6,而不是-2-因为全为1,然后我们将4位和1位删除。

[通常,Python整数的~x等于-x - 1(等效为-(x+1))。对于Python代码,这很少是有用的操作,但您永远不知道:)

© www.soinside.com 2019 - 2024. All rights reserved.