【问题标题】:How to create Python fixed length bits?如何创建 Python 固定长度位?
【发布时间】: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


【解决方案1】:

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)

【讨论】:

  • @PahleviFikriAuliya 实际上不需要,之前我在2 ** bits 中使用硬编码的32 而不是bits。这就是我必须这样做的原因。
【解决方案2】:

Python 的行为就像它的整数有无限多的位一样。因此,如果您在其中使用~,则字符串表示不能以无限数量的1s 开头,或者生成字符串将永远不会终止。相反,Python 选择将其表示为负数,因为它会使用二进制补码。如果您想将整数限制为多个位,请& 使用适当的掩码:

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

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2011-11-23
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多