【发布时间】:2014-04-25 20:37:06
【问题描述】:
我希望在 Python 中进行按位求反。
我的期望:
negate(0001) => 1110
但是 Python 的 ~0b0001 返回 -0b10。似乎 Python 将 1110 截断为 -0b10。
如何保留前导位?
另外,为什么
bin(~0b1) yields -0b10?
为该数据类型保留了多少位?
【问题讨论】:
标签: python python-3.x bit-manipulation
我希望在 Python 中进行按位求反。
我的期望:
negate(0001) => 1110
但是 Python 的 ~0b0001 返回 -0b10。似乎 Python 将 1110 截断为 -0b10。
如何保留前导位?
另外,为什么
bin(~0b1) yields -0b10?
为该数据类型保留了多少位?
【问题讨论】:
标签: python python-3.x bit-manipulation
Python 使用任意精度算术,因此您不必担心使用的位数。它还为bin(~0b1) 返回-0b10,因为它知道结果是-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)
【讨论】:
2 ** bits 中使用硬编码的32 而不是bits。这就是我必须这样做的原因。
Python 的行为就像它的整数有无限多的位一样。因此,如果您在其中使用~,则字符串表示不能以无限数量的1s 开头,或者生成字符串将永远不会终止。相反,Python 选择将其表示为负数,因为它会使用二进制补码。如果您想将整数限制为多个位,请& 使用适当的掩码:
>>> bin((~1) & 0b1111)
'0b1110'
【讨论】: