如何创建固定长度的Python位?
我想在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)