7
値( )を持つ整数があり、それを( )0b00000111
への関数に置き換えたいと思います。整数のビットを置き換えるのに最適なアルゴリズムは何ですか?13
0b00001101
例えば:
set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue?
これらは、32ビットを超える任意のサイズの整数に対して機能します。
def set_bit(value, bit):
return value | (1<<bit)
def clear_bit(value, bit):
return value & ~(1<<bit)
短いものが好きな場合は、次を使用できます。
>>> val = 0b111
>>> val |= (1<<3)
>>> '{:b}'.format(val)
'1111'
>>> val &=~ (1<<1)
'1101'
あなただけが必要です:
def set_bit(v, index, x):
"""Set the index:th bit of v to 1 if x is truthy, else to 0, and return the new value."""
mask = 1 << index # Compute mask, an integer with just bit 'index' set.
v &= ~mask # Clear the bit indicated by the mask (if x is False)
if x:
v |= mask # If x was True, set the bit indicated by the mask.
return v # Return the result, we're done.
>>> set_bit(7, 3, 1)
15
>>> set_bit(set_bit(7, 1, 0), 3, 1)
13
ビット番号 ( index
) は 0 から始まり、0 が最下位ビットであることに注意してください。
また、新しい値が返されることに注意してください。あなたが示すように「その場で」整数を変更する方法はありません(少なくとも私はそうは思いません)。
ビット単位の演算を使用できます。 http://wiki.python.org/moin/BitwiseOperators
特定のビットを 1 に設定する場合は、特定の位置に 1 を指定してビット単位の「or」を使用できます。
0b00000111 | 0b00001000 = 0b00001111
特定のビットを 0 に設定するには、ビット単位の「and」を使用できます
0b00001111 & 0b11111011 = 0b00001011
接頭辞 0b は 2 進数用、0x は 16 進数用であることに注意してください。