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 に答える