题目:
给定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));
}
本文介绍了一种使用位操作来更新特定范围内的位值的方法。通过一个具体的例子,详细解释了如何将一个32位整数N的第i到j位用另一个整数M的相应位替换。文章提供了一个Java方法实现,并解释了每一步的操作目的。
1365

被折叠的 条评论
为什么被折叠?



