如何创建固定长度的Python位?

2 投票
2 回答
2583 浏览
提问于 2025-04-18 04:11

我想在Python中进行按位取反操作。

我期望的结果是:

negate(0001) => 1110

但是在Python中,~0b0001的结果是-0b10。看起来Python把1110截断成了-0b10。

我该如何保留前面的位呢?

另外,为什么会这样呢?

bin(~0b1) yields -0b10?

这个数据类型保留了多少位?

2 个回答

1

在Python中,整数就好像有无穷多的位数一样。因此,如果你对一个整数使用~这个操作符,它的字符串表示就不能以无穷多个1开头,否则生成这个字符串的过程就永远不会结束。为了避免这种情况,Python选择用负数来表示,就像使用二进制补码那样。如果你想限制整数的位数,可以用&操作符和一个合适的掩码进行运算:

>>> bin((~1) & 0b1111)
'0b1110'
2

Python使用的是任意精度的算术运算,所以你不用担心数字的位数问题。此外,当你执行 bin(~0b1) 时,它会返回 -0b10,因为Python知道结果是 -2,并且以 10 的形式表示这个数字,同时把负号放在前面(这只针对负数)。

不过,我们可以使用 format 函数来按照自己的方式表示数字,比如这样:

def negate(number, bits = 32):
    return format(~number & 2 ** bits - 1, "0{}b".format(bits))

print(negate(1))
# 11111111111111111111111111111110
print(negate(1, bits = 4))
# 1110

或者,正如 eryksun 所建议的那样,

def negate(number, bits = 32):
    return "{:0{}b}".format(~number & 2 ** bits - 1, bits)

撰写回答