给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。
编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。
题目保证从 i 位到 j 位足以容纳 M, 例如: M = 10011,则 i~j 区域至少可容纳 5 位。
示例1:
输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6
输出:N = 1100(10001001100)
示例2:
输入: N = 0, M = 31(11111), i = 0, j = 4
输出:N = 31(11111)
题解:
class Solution {
public int insertBits(int N, int M, int i, int j) {
int[] nbits = new int[32]; // N 的二进制数组
int[] mbits = new int[32]; // M 的二进制数组
int mask = 1;
// 处理N的二进制数组,例如 N=8 [...1, 0, 0, 0]
for (int m=0; m<32; m++) {
if ((N & mask) != 0) {
nbits[m] = 1;
}
mask = mask << 1;
}
mask = 1;
// 同上
for (int m=0; m<32; m++) {
if ((M & mask) != 0) {
mbits[m] = 1;
}
mask = mask << 1;
}
for (int k=i; k<=j; k++) {
nbits[k] = mbits[k-i];
}
// 处理成原来的数
int ret = 0;
mask = 1;
for (int m=0; m<32; m++) {
ret = ret + (nbits[m] * mask);
mask = mask << 1;
}
return ret;
}
}