次の計算を実行するより効率的な方法はありますか?それはうまく機能しますが、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
実際には、を述べる必要はありません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
これにより、ビットが設定解除されます。
x ^= 1 << 3 & x
関数内:
def unset_bit(x, n):
return 1 << n & x ^ x
これを使用して、次のビットをクリアできますx
。
x &= ~(1 << index)