gpt4 book ai didi

Python 按位取反不翻转位

转载 作者:行者123 更新时间:2023-12-05 03:54:10 26 4
gpt4 key购买 nike

当使用 pythons inverse ~ 时,这些位似乎没有像我期望的那样翻转。我相信困惑在于我对 python 如何使用 2 的补码存储数字的理解。

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

输出:-0b110

预期:-0b010 或 -0b10

最佳答案

这不是 ~ 运算符的问题,它执行它应该做的事情,而是您用来显示结果的 bin 函数的问题.

在 Python 中,与在大多数计算机系统中一样,负整数在内部以“二进制补码”二进制表示形式存储。这意味着 -1 由所有 1 位的序列表示,并且每个较低的整数都会根据正常的整数减法规则修改该值。所以 -2 是由 -1 减去 1 得到的,你得到一堆 1 位,后面是最后一位为零。

这里有一些数字和它们的 4 位补码二进制表示:

 0 : 0000
1 : 0001
2 : 0010
5 : 0101
-1 : 1111 # this is ~0
-2 : 1110 # this is ~1
-3 : 1101 # this is ~2
-6 : 1010 # this is ~5

与许多其他语言不同,Python 的整数没有预定义的位长度。它们不是 16 位或 32 位长,就像 C 中的 shortlong 整数一样。相反,它们是动态调整大小的,可以根据需要添加更多位来表示越来越大的数字。当您需要将二进制数字表示为文本时(如 bin 函数所做的那样),这会导致棘手的情况。如果您知道您的数字仅使用 16 位,则每次都可以写出一个 16 位数字的字符串,但动态大小的数字需要不同的解决方案。

确实,Python 在 bin 函数中做了一些不同的事情。正数用表示其值所需的最短位数写入。并且负数不是以补码形式写入(它们实际上在内部编码的方式),而是通过在其绝对值的位表示前面放置一个减号。

所以你得到一个这样的表,其中按位补码不明显:

 0 :    0b0
1 : 0b1
2 : 0b10
5 : 0b101
-1 : -0b1
-2 : -0b10
-3 : -0b11
-6 : -0b110

至于如何获得负数的二进制表示,如第一个表中的负数,唯一好的方法是选择大于任何数字的 2 的幂,并将其添加到之前的所有负值格式:

MY_MAXINT = 2**4
for v in [0,1,2,5,-1,-2,-3,-6]:
if v < 0:
v += MY_MAXINT
print(format(v, '04b'))

关于Python 按位取反不翻转位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61219577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com