是否有更有效的方法执行以下计算?它运行正常,但有些东西告诉我x &= (1 << 8) - 1 ^ 1 << 3
可以编写以避免一些计算并提高速度。
def unset_mask(width, index):
return (1 << width) - 1 ^ 1 << index
x = 0b11111111
x &= unset_mask(8, 3)
assert x == 0b11110111
答案 0 :(得分:3)
实际上,您无需说明width
。当你这么做时,Bigints的行为正确:
>>> bin(255 & ~(1 << 3))
'0b11110111'
>>> bin(65535 & ~(1 << 3))
'0b1111111111110111'
>>> bin(75557863725914323419135 & ~(1 << 3))
'0b1111111111111111111111111111111111111111111111111111111111111111111111110111'
这是因为负数有"infinite" string of ones preceding them。因此,当您补充一个正数(以“infinte”字符串的零开头)时,您会得到一个负数(确切地说-(x + 1)
)。只是不要相信负数的bin
表示;它不反映内存中的实际位。
所以你会像这样重写unset_mask
:
def unset_mask(index):
return ~(1 << index)
x = 0b11111111
x &= unset_mask(3)
print x == 0b11110111 # prints True
答案 1 :(得分:1)
这将取消位:
x ^= 1 << 3 & x
在一个功能中:
def unset_bit(x, n):
return 1 << n & x ^ x
答案 2 :(得分:1)
您可以使用它来清除x
中的位:
x &= ~(1 << index)