2012-02-09 51 views
1

我陷入困境的一部分,我需要做到以下几点: 给定一个数X(说10101010)和一些Y(说1110)和两个位置变量I,J(说I = 1,J = 4),我需要做的是从i设置在X的所有位到j在Y. 比特匹配对于上面的例子中,答案应该是101 | | 0。如何设置X值的位的子集来者Y中

该解决方案是我脑子里想的是:

1. Right shift X >> i 
3. Run loop from 0 to j-1 
2. if(!(X (lsb)^Y(lsb)), then continue, else X(lsb) = ~X(lsb) 

的这里的事情是我不知道如何与各个位玩。

回答

4
  1. 创建的掩模,其中只有零处于比特位置ij,这是〜(2 J + 1 - 2

  2. 结果= (mask & X) | (Y << i)

Python中的示例:

def replace_bits(X, Y, i, j): 
    mask = ~(2**(j+1) - 2**i) 
    return (mask & X) | (Y << i) 

>>> replace_bits(int('10101010', 2), int('1110', 2), 1, 4) 
188 
>>> bin(replace_bits(int('10101010', 2), int('1110', 2), 1, 4)) 
'0b10111100' 
4

2 ^的J - 1给出了一个数,其中第一到第j位为1。

所以Z =(2 ^的J - 1) - (2^I - 1)具有从i到j组的所有比特为1

现在移位由i位左Y。

X - (X & Z)+ Y是最终答案。

相关问题