web-dev-qa-db-ja.com

整数のビットを変更する方法は?

70b00000111)の整数があり、130b00001101)への関数に置き換えたいと思います。整数のビットを置き換えるのに最適なアルゴリズムは何ですか?

例えば:

set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue?
18
Váradi Norbert

あなたはただ必要です:

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であることにも注意してください。表示されているように整数を「インプレース」に変更する方法はありません(少なくとも私はそうは思いません)。

28
unwind

これらは、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'
26
Kos

ビット演算を使用できます。 http://wiki.python.org/moin/BitwiseOperators

特定のビットを1に設定する場合は、ビット単位の「または」を1に指定の位置で使用できます。

0b00000111| 0b00001000=0b00001111

特定のビットを0に設定するには、ビット単位の「and」を使用できます

0b000011110b11111011=0b00001011

接頭辞0bは2進数、0xは16進数です。

8
wmiel