如何修改整数中的多个位?

How to modify multiple bits in an integer?

挑战:

我想写一个需要

的方法
  1. 整数值
  2. START_BIT
  3. START_BIT
  4. 之后要替换的位数
  5. REPLACING_BIT(布尔值)

Return:根据输入修改后的值。

输入示例:

预期输出:

即从第二位位置开始用零替换 3 位。

当前代码:

def set_bit(original_int:int, start_bit_pos:int, number_of_bits:int, bit_value:bool):
    if number_of_bits < 1: number_of_bits = 1
        
    out = original_int
    for i in range(number_of_bits):
        if bit_value == 1:
            out = out | (1<<(start_bit_pos+i))
        else:
            out = out & ~(1<<(start_bit_pos+i))
    print('old binary: '+ '{:b}'.format(original_int),f' Decimal: {original_int}' )
    print('new binary: '+ '{:b}'.format(out), f' Decimal: {out}' )
    return out

set_bit(original_int = 255, start_bit_pos= 2, number_of_bits = 3, bit_value = 0)
set_bit(original_int = 64, start_bit_pos= 2, number_of_bits = 3, bit_value = 1)

当前问题:

上面的代码是函数式的,但我确实觉得它有点矫枉过正,所以我想知道是否有一个标准的 python 函数可以做类似的事情?

  • 1 位的序列是 1
  • 一个 2 位的序列是 11 或十进制的 3.
  • 一个 3 位的序列是 111 或十进制的 7。
  • N位的序列为2^N-1,与(1 << N) - 1相同。

如果起始位置不是 0,您还必须将其向左移动。

因此,您可以简单地这样做:

def set_bit(original_int:int, start_bit_pos:int,
            number_of_bits:int, bit_value:bool):
    mask = (1 << number_of_bits) - 1 << start_bit_pos
    if bit_value:
        return original_int | mask
    return original_int & ~mask

这是一个函数,可以更新任意字长的任意位置的任意位数。这里x是原始整数,start_bit是第一次插入的位置,从右(最低位)0开始,field_size是要替换的位数,val 是插入字段的值。 word_size 应反映 x

中预期的位数
def apply_bits(x, start_bit, field_size, val, word_size=8):
    
    print("x=",bin(x))
    
    mask = 2**word_size - 1 - (2**field_size -1) * (2**start_bit)
    print("mask=",bin(mask))
    
    val = min(val, 2**(field_size) - 1)
    print("val=", bin(val))
    
    w = val * 2**start_bit
    
    print("w=",bin(w))
        
    y = (x & mask) | w
    print("y=",bin(y))
    
    return(y)

例如:

>>> apply_bits(x=0b10000001,start_bit=2,field_size=4,val=0b1010,word_size=8)
   x= 0b10000001
 val= 0b1010
mask= 0b11000011
   w= 0b101000
   y= 0b10101001

apply_bits(x=0b10101010101010101,start_bit=4,field_size=8,val=0b11100111,word_size=16)
   x= 0b10101010101010101
 val= 0b11100111
mask= 0b1111000000001111
   w= 0b111001110000
   y= 0b101111001110101

首先,该函数在字段位置制作一个零掩码。然后该值被限制为适合字段大小并移动到位。最后,使用按位与将字段清零,并使用按位或将新值放入。 print 语句让您跟随整个过程。