首页 > 代码库 > Single Number II ——位操作

Single Number II ——位操作

题意:

     给定两个32位的整数 N 和 M,以及表示比特位置的 i 与 j 。编写一个方法,将 M 插入 N,使得 M 从 N 的第 j 位开始,到第 i 位结束。假定从 j 位到 i 位足以容纳M。

输入:N = 10000101000,M = 10011,i = 2, j = 6

输出:N = 10001001100

解题思路 :

   根据题意,我们将问题解决分为三个步骤:

  (1)将 N 中从 j 到 i 之间的位清零;

  (2)对 M 进行移位操作,M << i

  (3)合并 M 与 N 。

  为了完成步骤1,我们可以使用掩码来清零,除j到i之间的位为0外,这个掩码其余位为1。例如本题中,i = 2,j = 6,则掩码为11110000011。

具体代码如下:

public int updateBits(int n,int m,int i,int j) {
    /*
     *创建掩码,用来除 n中 i到 j的位
     *本题中,i = 2,j = 6,则掩码为11110000011 
     */
    int allOnes = ~0; //一连串的 1 
    
    //在位置 j 之前的位均为1,其余为0,则 left = 11110000000
    int left = allOnes << (j + 1);                         
            
    //在位置 i 之后的位均为1,其余为0,则right = 00000000011
    int right = ((1 << i) - 1);                             
    
    //除 i 到 j的位为 0,其余为1 则mask = 11110000011
    int mask = left | right;
         
    int n_cleared = n & mask; //清楚n中j到i的位    
    int m_shifted = m << i;  //将M移至相应的位置 
    
    return n_cleared | m_shifted; //对两者进行位或操作 
}