如何修改整数中的位?

     2023-02-18     79

关键词:

【中文标题】如何修改整数中的位?【英文标题】:How to modify bits in an integer? 【发布时间】:2012-08-23 19:37:35 【问题描述】:

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

例如:

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

【问题讨论】:

就像在 C 中一样。wiki.python.org/moin/BitwiseOperators 小心你的字面整数前缀...0x十六进制数字的前缀。你想要的前缀是0b 【参考方案1】:

您可以使用按位操作。 http://wiki.python.org/moin/BitwiseOperators

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

0b00000111 | 0b00001000 = 0b00001111

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

0b00001111 & 0b11111011 = 0b00001011

注意,0b 前缀是二进制数,0x 是十六进制数。

【讨论】:

您好,与其发布新答案并删除旧答案,不如考虑编辑旧答案。 :-) 这是我的意图,但我在两个选项卡中打开它并从错误的一个选项卡发送:) 但我想按索引设置字节数。 然后(正如@unwind 向您展示的那样)您可以取 0b1 (=1) 并将其向左移动到正确的位置(他的代码中的 1 【参考方案2】:

你只需要:

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 是最低有效位。

还要注意,新值是返回的,没有办法像你展示的那样“就地”修改整数(至少我不这么认为)。

【讨论】:

他漫不经心地说,好像成千上万没有二进制经验的人多年来不必一步一步地遍历这段代码,以弄清楚它到底在做什么导致它工作如此完美。 @Aerovistae Heh ... 不知道你是不是在开玩笑。我添加了 cmets 以使代码更加清晰。希望这将为所有这些人节省一些工作。 :) 谢谢!我确实是在开玩笑。必须完全重新学习我的二进制操作以了解发生了什么;从大学起就没有碰过它们。 您可能很高兴知道 as is 这也适用于 numpy 数组。 v 可以是 numpy 数组,index 可以是标量,也可以是与v 长度相同的 numpy 数组。很有用!谁知道设置位需要如此聪明。 @SwiftsNamesake 我敢肯定它可以被巧妙地解决,但这很清楚目标是什么。【参考方案3】:

这些适用于任何大小的整数,甚至大于 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'

【讨论】:

在整数中设置和清除标志真是太棒了!没有库需要:)【参考方案4】:

按照提供的示例,听起来您正在寻找整数中的位交换。 例如在 7 (0b00000111) 中,如果交换第 3 位和第 1 位的位,则得到 13 (0b00001101)

我将有以下作为函数签名swap_bits(val, i, j)

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

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

代码利用了一些小技巧,这里是 Sean Anderson 的 good resource。我正在努力在 Python here 中提供代码 sn-ps。

【讨论】:

这个位排序代码中的位操作是如何工作的?

】这个位排序代码中的位操作是如何工作的?【英文标题】:Howdothebitmanipulationsinthisbit-sortingcodework?【发布时间】:2010-11-0605:18:18【问题描述】:JonBentley在他的书ProgrammingPearls的第1列中介绍了一种使用位向量对非零正整数序列进... 查看详情

我如何显示一个字节的位长,而不是整数

】我如何显示一个字节的位长,而不是整数【英文标题】:howdoishowbitlengthofabyte,NOTInteger【发布时间】:2021-11-2917:51:49【问题描述】:#Python3+我读取bin字节读取大小=1open(ArgsFile,"rb")asf:byte=f.read(ReadSize)打印(字节)示例输出\'h\'显... 查看详情

Python中正整数的位长

...15=0b101->310=0b1010->4100=0b1100100->71000=0b1111101000->10…如何获取整数的位长,即在Python中表示正整数所需的位数?【问题讨论 查看详情

如何计算 3D Morton 数(交错 3 个整数的位)

】如何计算3DMorton数(交错3个整数的位)【英文标题】:Howtocomputea3DMortonnumber(interleavethebitsof3ints)【发布时间】:2010-11-0417:10:53【问题描述】:我正在寻找一种快速计算3D莫顿数的方法。Thissite有一个基于幻数的技巧来处理2D莫顿... 查看详情

Postgres 中的位掩码

...到以下错误:PGError:错误:运算符不存在:字符变化和整数提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。models_mask是数据库中的一个整数。 查看详情

如何左移整数的位(代码片段)

...我猜是因为Ruby中Integer的理论上无限制的大小而发生的。如何做到不溢出?答案Ruby将自动切换到不同的内部表示形式以容纳更大的数字,因此您需要使用掩码将其设置为上限:classIntegerdefrotl32(n)mask=(1<<(32-n))-1((self&mask)<&... 查看详情

python3中的位运算符

...、Linux运维等)中并不常见。Python位运算符只能用来操作整数类型,它按照整数在内存中的二进制形式进行计算。符号名称描述&按位与只有两边二进制位数均为1时,输出才为1|按位或只要二进制位数有一边为1,输出就为1^按... 查看详情

16位二进制补码有符号整数信号数据的位平面分解?

...位平面分解,因此我将获得16个信号数据位平面。我知道如何分解一个8位无符号整数图像信号,我重新实现了 查看详情

如何将Mysql中的位类型映射到休眠?

】如何将Mysql中的位类型映射到休眠?【英文标题】:HowmapabittypeinMysqltohibernate?【发布时间】:2011-07-3020:29:10【问题描述】:我在课堂上使用逆向工程并得到这个:@Entity@Table(name="user",catalog="bytecode",uniqueConstraints=@UniqueConstraint(colu... 查看详情

在 MIPS 程序集中反转数字的位

...语言,我被要求编写一个执行以下操作的程序:接受一个整数作为用户输入将该整数打印为有符号二进制数反转该整数中的位打印结果反转的数字(也是二进制)除了我显然需要使用移位操作和两个移位值之间的逻辑比较之外,... 查看详情

Python 和 Java 中的位操作

...在解决一个问题,其中给定的数组如下:"给定一个非空整数数组,每个元素都出现3次,只有一个元素只出现一次。找到那个唯一的元素。"例如:Input:[2,2,3,2]Output:3我正在尝试使用BitManipulation来解决它,我在Python中的代码如下:d 查看详情

如何翻转 T-SQL 中的位域?

】如何翻转T-SQL中的位域?【英文标题】:HowtoflipbitfieldsinT-SQL?【发布时间】:2009-09-0903:00:43【问题描述】:我正在尝试使用更新查询翻转SQLServer中的位字段,也就是说,我想将所有0变为1,反之亦然。什么是最优雅的解决方案?... 查看详情

检查整数中是不是只设置了一个位(无论其位置如何)

】检查整数中是不是只设置了一个位(无论其位置如何)【英文标题】:Checkifonlyonesinglebitissetwithinaninteger(whateveritsposition)检查整数中是否只设置了一个位(无论其位置如何)【发布时间】:2012-11-1616:10:00【问题描述】:我使用64... 查看详情

Java 中的位 & (AND) 是如何工作的?

】Java中的位&(AND)是如何工作的?【英文标题】:HowDoesTheBitwise&(AND)WorkInJava?【发布时间】:2013-06-1920:21:32【问题描述】:我正在阅读一些代码示例,并在Oracle网站的BitwiseandBitShiftOperators页面上看到了&amp;。在我看来,它... 查看详情

具有整数提升的位操作

】具有整数提升的位操作【英文标题】:Bitoperationswithintegerpromotion【发布时间】:2016-11-2113:47:47【问题描述】:tl;dr在进行整数提升时,位操作是否安全且行为符合预期(类型短于int)?例如uint8_ta,b,c;a=b&~c;这是我所拥有的粗... 查看详情

acm中的位运算技巧

...;为0偶数)获取二进制为是1还是0(&运算)交换两个整数变量的位置不用判断语句,求整数的绝对值  查看详情

Java 迭代字节数组中的位

...BitsinByteArray【发布时间】:2010-11-0506:57:00【问题描述】:如何迭代字节数组中的位?【问题讨论】:你不能。至少不是直接的。你想做什么,也许有更好的方法。字节数组包含字节的集合。再一次,我希望java.util.BitSet有一个byte[... 查看详情

如何使用 C++ 中的位操作从长变量中破译 4 个短变量?

】如何使用C++中的位操作从长变量中破译4个短变量?【英文标题】:Howtodecipher4shortvarsfromalongvarusingbitmanipulationsinC++?【发布时间】:2011-01-1721:23:21【问题描述】:longwxyz;//(w=bits0-8,x=bits9-17,y=bits18-23,z=bits24-29)shortw;shortx;shorty;shortz;w=... 查看详情