如何创建Python固定长度位?

时间:2014-04-25 06:26:32

标签: python python-3.x bit-manipulation

我希望在Python中进行逐位否定。

我的期望:

negate(0001) => 1110

但Python的〜0b0001返回-0b10。似乎Python将1110截断为-0b10。

如何保持领先位?

而且,为什么

bin(~0b1) yields -0b10?

为该数据类型保留了多少位?

2 个答案:

答案 0 :(得分:2)

Python使用任意精度算术,因此您不必担心使用的位数。此外,它还会为-0b10返回bin(~0b1),因为它了解结果为-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

或者,suggested by eryksun

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

答案 1 :(得分:1)

Python的行为就好像它的整数具有无限多位。因此,如果在一个上使用~,则字符串表示不能以无限数量的1开头,否则生成字符串将永远不会终止。相反,Python选择将其表示为负数,因为它将使用两个恭维。如果要将整数限制为多个位,请将&对应适当的掩码:

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