4

是否有更有效的方法来执行以下计算?它工作得很好,但有些东西告诉我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
4

3 回答 3

3

实际上,您不需要声明width. 当你这样做时,Bigints 的行为是正确的:

>>> bin(255 & ~(1 << 3))
'0b11110111'
>>> bin(65535 & ~(1 << 3))
'0b1111111111110111'
>>> bin(75557863725914323419135 & ~(1 << 3))
'0b1111111111111111111111111111111111111111111111111111111111111111111111110111'

这是因为负数前面有一个“无限”字符串。因此,当您对一个正数(以“无限”零字符串开头)进行补码时,您会得到一个负数(-(x + 1)准确地说)。只是不要相信bin负数的表示;它不反映内存中的实际位。

所以你会像这样重写unset_mask

def unset_mask(index):
    return ~(1 << index)

x = 0b11111111
x &= unset_mask(3)
print x == 0b11110111  # prints True
于 2012-07-10T20:40:43.033 回答
1

这将取消设置位:

x ^= 1 << 3 & x

在一个函数中:

def unset_bit(x, n):
    return 1 << n & x ^ x
于 2012-07-10T20:38:53.627 回答
1

您可以使用它来清除以下内容x

x &= ~(1 << index)
于 2012-07-10T20:50:07.087 回答