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; //对两者进行位或操作 }