33

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

例えば:

set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue?
4

4 に答える 4

55

これらは、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'
于 2012-08-29T08:54:01.220 に答える
43

あなただけが必要です:

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 が最下位ビットであることに注意してください。

また、新しい値が返されることに注意してください。あなたが示すように「その場で」整数を変更する方法はありません(少なくとも私はそうは思いません)。

于 2012-08-29T08:49:01.417 に答える
10

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

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

0b00000111 | 0b00001000 = 0b00001111

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

0b00001111 & 0b11111011 = 0b00001011

接頭辞 0b は 2 進数用、0x は 16 進数用であることに注意してください。

于 2012-08-29T08:39:38.120 に答える