如何修改整数中的多个位?
How to modify multiple bits in an integer?
挑战:
我想写一个需要
的方法
- 整数值
- START_BIT
- START_BIT
之后要替换的位数
- REPLACING_BIT(布尔值)
Return:根据输入修改后的值。
输入示例:
- 十进制:255 或二进制:11111111
预期输出:
- 十进制:227 或二进制:11100011
即从第二位位置开始用零替换 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
语句让您跟随整个过程。
挑战:
我想写一个需要
的方法- 整数值
- START_BIT
- START_BIT 之后要替换的位数
- REPLACING_BIT(布尔值)
Return:根据输入修改后的值。
输入示例:
- 十进制:255 或二进制:11111111
预期输出:
- 十进制:227 或二进制:11100011
即从第二位位置开始用零替换 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
语句让您跟随整个过程。