题目:
给定32bit的数字N、M,两个字节位i、j(0<i<j)。写一个算法将数字N的第i到j之间的bit值替换为数字M的bit值。
例如下面的这个例子:
int N = 0b10000000000, int M = 0b10101, int i = 2, int j = 6;
替换的结果为 N = 0b10001010100;
解答:
//对于输入参数的校验省略,假设所有的入参都符合要求
private int updateBits(int N, int M, int i, int j){
//bit位全是1
int max = ~0;
//第一位到j位之间全是0,包括j位,j+1位到32位之间全是1
int left = max - (1<<j - 1);
//长度为i,bit位全为1的数
int right = 1<<i - 1;
//第i+1到j位之间全为0,其他位全为1
int mask = left | right;
//1. 将N的i到j位全部置为0;
//2. 将M左移i位;
//3. 将左移之后的M的j位之前进行截断
//4. 将截断后的M设置到N的i到j位之间
return (N & mask) | ((M<<i) & (~mask));
}