値7
(0b00000111
)の整数があり、13
(0b00001101
)への関数に置き換えたいと思います。整数のビットを置き換えるのに最適なアルゴリズムは何ですか?
例えば:
set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue?
あなたはただ必要です:
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が最下位ビットであることに注意してください。
また、新しい値はreturnedであることにも注意してください。表示されているように整数を「インプレース」に変更する方法はありません(少なくとも私はそうは思いません)。
これらは、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'
ビット演算を使用できます。 http://wiki.python.org/moin/BitwiseOperators
特定のビットを1に設定する場合は、ビット単位の「または」を1に指定の位置で使用できます。
0b00000111| 0b00001000=0b00001111
特定のビットを0に設定するには、ビット単位の「and」を使用できます
0b00001111&0b11111011=0b00001011
接頭辞0bは2進数、0xは16進数です。