如何修改整数位?

Vár*_*ert 17 python binary bit

我有一个带值7(0b00000111)的整数我想用函数替换它13(0b00001101).替换整数位的最佳算法是什么?

例如:

set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue?
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 29

您只需要:

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
Run Code Online (Sandbox Code Playgroud)

注意,位数(index)从0开始,0是最低有效位.

还要注意,返回了新值,没有办法像你显示的那样"就地"修改整数(至少我不这么认为).

  • 他漫不经心地说道,就好像成千上万没有二进制经验的人不必多年来一步一步地浏览这段代码,就能弄清楚它到底在做什么,导致它如此完美地工作。 (2认同)

Kos*_*Kos 27

这些适用于任何大小的整数,甚至大于32位:

def set_bit(value, bit):
    return value | (1<<bit)

def clear_bit(value, bit):
    return value & ~(1<<bit)
Run Code Online (Sandbox Code Playgroud)

如果你喜欢简短的东西,你可以使用:

>>> val = 0b111
>>> val |= (1<<3)
>>> '{:b}'.format(val)
'1111'
>>> val &=~ (1<<1)
'1101'
Run Code Online (Sandbox Code Playgroud)

  • 幂等性 - 如果给定位已被清除,减法将影响其他位;按位运算根本不会触及其他位 (3认同)
  • 在整数中设置和清除标志非常棒!没有图书馆需要:) (2认同)

小智 8

您可以使用按位运算. http://wiki.python.org/moin/BitwiseOperators

如果要将给定位设置为1,则可以在给定位置使用按位"或"1:

0b00000111 | 0b00001000 = 0b00001111

要将给定位设置为0,您可以使用按位'和'

0b000011110b11111011 = 0b00001011

请注意,0b前缀用于二进制数,0x用于十六进制数.