, , j ( ) ; , 2 6 6 ( Python ). , :
def update_bits(n, m, i, j):
max = ~0
left = max - ((1 << (j+1)) - 1)
right = ((1 << i) - 1)
mask = left | right
# Clear i through j, then put m in there
return (n & mask) | (m << i)
.
:
def update_bits(n, m, i, j):
left = (~0) << (j+1)
right = ((1 << i) - 1)
mask = left | right
# Clear i through j, then put m in there
return (n & mask) | (m << i)
.
, , b = 0, , a, . a = '0b1011001111101111' b = '0b0' i j 6 8 , , '0b1011001000101111'. , :
def set_bits(a, b, i, j):
while i <= j:
if b & 1 == 1:
last_bit = (b & 1) << i
a |= last_bit
else:
set_bit = ~(1 << i)
a &= set_bit
b >>= 1
i += 1
return a
, 10'000'000 , :
for i in range(10000000):
m = randint(0,65536)
i = randint(0,15)
j = randint(i,16)
n = randint(0,2**(j-i))
if set_bits(m,n,i,j) != update_bits(m,n,i,j):
print((bin(m),bin(n),i,j,bin(set_bits(m,n,i,j)),bin(update_bits(m,n,i,j)))) #This line is never printed.
, , (, , ), , (i j , i < j ..), .