我希望在Python中进行逐位否定。
我的期望:
negate(0001) => 1110
但Python的〜0b0001返回-0b10。似乎Python将1110截断为-0b10。
如何保持领先位?
而且,为什么
bin(~0b1) yields -0b10?
为该数据类型保留了多少位?
答案 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
def negate(number, bits = 32):
return "{:0{}b}".format(~number & 2 ** bits - 1, bits)
答案 1 :(得分:1)
Python的行为就好像它的整数具有无限多位。因此,如果在一个上使用~
,则字符串表示不能以无限数量的1
开头,否则生成字符串将永远不会终止。相反,Python选择将其表示为负数,因为它将使用两个恭维。如果要将整数限制为多个位,请将&
对应适当的掩码:
>>> bin((~1) & 0b1111)
'0b1110'