Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修改整数中的位?_Python_Binary_Bit - Fatal编程技术网

Python 如何修改整数中的位?

Python 如何修改整数中的位?,python,binary,bit,Python,Binary,Bit,我有一个值为7(0b00000111)的整数,我想用一个函数替换它,使之成为13(0b00001101)。替换整数中的位的最佳算法是什么 例如: set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue? 您可以使用位操作。 如果要将给定位设置为1,可以在给定位置使用按位“或”和1: 0b00000111|0b00001000=0b00001111 要将给定位设置为0,可以使用按位“and” 0b00001111

我有一个值为
7
0b00000111
)的整数,我想用一个函数替换它,使之成为
13
0b00001101
)。替换整数中的位的最佳算法是什么

例如:

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

您可以使用位操作。

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

0b00000111|0b00001000=0b00001111

要将给定位设置为0,可以使用按位“and”

0b000011110b11111011=0b00001011

请注意,0b前缀表示二进制数,0x表示十六进制数。

您只需要:

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
def set_位(v,索引,x):
“”“如果x为真,则将v的第位索引设置为1,否则设置为0,并返回新值。”“”

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

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

def clear_bit(value, bit):
    return value & ~(1<<bit)
def set_位(值,位):
返回值|(1>>val |=(1>'{:b}'。格式(val)
'1111'

>>>val&=~(1根据所提供的示例,听起来您希望交换整数中的位。 例如,在7
(0b00000111)
中,如果交换第3和第1位置的位,则获得13
(0b00001101)

我将以下内容作为函数签名
swap_位(val,I,j)

最好的算法是什么?好的,下面的算法需要恒定的时间,O(1)


代码利用了位旋转技巧,下面是Sean Anderson的一篇文章。我正在用Python提供代码片段。

就像在C中一样。注意文字整数的前缀…
0x
是十六进制数的前缀。您需要的前缀是
0b
。您好,而不是发布新答案并删除旧的一个,只需编辑你的旧答案。(-)这是我的意图,但是我把它在两个选项卡上打开,并从错误的一个发送:),但是我想按索引设置字节。然后(如@ ununvund),你可以取0b1(=1),并把它移到正确的位置(1个可怕的设置和清除标志在一个整数中!没有库需要:)他漫不经心地说,好像数千名没有二进制经验的人不必在这些年中一步一步地浏览这段代码,就可以弄清楚到底是什么原因使它工作得如此完美。@Aerovistae Heh…不确定你是不是在开玩笑。我添加了一些注释以使代码更加清晰。希望这能帮助你理解I’我给所有这些人做了些工作。:)谢谢!我确实是在开玩笑。必须完全重新学习我的二进制运算来理解发生了什么;从大学开始就没碰过它们。你可能会很高兴知道这也适用于numpy阵列
v
可以是numpy数组,
index
可以是标量数组,也可以是与
v
长度相同的numpy数组。非常有用!谁知道设置位需要这么聪明呢。@SwiftsNamesake我相信它可以被聪明地设计出来,但这让我们很清楚目标是什么。
>>> val = 0b111
>>> val |= (1<<3)
>>> '{:b}'.format(val)
'1111'
>>> val &=~ (1<<1)
'1101'
def swap_bits(val, i, j):
    """
    Given an integer val, swap bits in positions i and j if they differ
    by flipping their values, i.e, select the bits to flip with a mask.
    Since v ^ 1 = 0 when v = 1 and 1 when v = 0, perform the flip using an XOR.
    """
    if not (val >> i) & 1 == (val >> j) & 1:
        mask = (1 << i) | (1 << j)
        val ^= mask
    return val
 >>> swap_bits(7, 3, 1)
 13