Binary 位操作破解编码访问

Binary 位操作破解编码访问,binary,mask,operations,Binary,Mask,Operations,我一直在努力解决CTCI中的第一个问题,这涉及到位操作,但我无法理解作者在最终解决方案中是如何准确制作面具的。有人能解释一下“int left”、“int right”和“int mask”的计算吗?对于他提供的例子,看看这些线具体是如何计算的,这将是非常棒的 问题是: 您将获得两个32位数字N和M,以及两个位位置i和j。写一篇 方法将N中i和j之间的所有位设置为等于M(例如,M成为 N位于i,从j开始)。 例子: 输入:N=1000000000,M=10101,i=2,j=6 输出:N=100

我一直在努力解决CTCI中的第一个问题,这涉及到位操作,但我无法理解作者在最终解决方案中是如何准确制作面具的。有人能解释一下“int left”、“int right”和“int mask”的计算吗?对于他提供的例子,看看这些线具体是如何计算的,这将是非常棒的

问题是: 您将获得两个32位数字N和M,以及两个位位置i和j。写一篇 方法将N中i和j之间的所有位设置为等于M(例如,M成为 N位于i,从j开始)。 例子: 输入:N=1000000000,M=10101,i=2,j=6 输出:N=10001010100

public static int updateBits(int n, int m, int i, int j) {
int max = ~0; /* All 1’s */

// 1’s through position j, then 0’s
int left = max - ((1 << j) - 1);

// 1’s after position i
int right = ((1 << i) - 1);

// 1’s, with 0s between i and j
int mask = left | right;

// Clear i through j, then put m in there
return (n & mask) | (m << i);
}
publicstaticintupdatebits(intn,intm,inti,intj){
int max=~0;/*所有1*/
//1穿过位置j,然后是0
int left=最大值-((1
解释“int left”、“int right”和“int mask”的计算

i=2,j=6:

left      111111000000
right     000000000011
|         ------------
mask      111111000011
现在,尽管这个示例值产生了正确的结果,但我们可以看到
updateBits()的实现
实际上是错误的,因为
掩码的
左侧部分
只需要
1
位,而不包括位置
j
,因为位位置
j
属于要屏蔽的子字符串。错误显示为,例如,使用值n=11111111,m=00000,i=2,j=6:

left      111111000000
right     000000000011
|         ------------
mask      111111000011
n 0111111
掩模111111000011
&       ------------
n&mask 0111111000011
M
// 1’s after position i
int right = ((1 << i) - 1);
i          1<<i            (1<<i)-1
-------------------------------------
0      000000000001      000000000000
1      000000000010      000000000001
2      000000000100      000000000011
...
// 1’s, with 0s between i and j
int mask = left | right;
left      111111000000
right     000000000011
|         ------------
mask      111111000011
// Clear i through j, then put m in there
return (n & mask) | (m << i);
n       010000000000
mask    111111000011
&       ------------
n&mask  010000000000
m<<i    000001010100
|       ------------
        010001010100
n       011111111111
mask    111111000011
&       ------------
n&mask  011111000011
m<<i    000000000000
|       ------------
        011111000011
int left = max - ((1 << j) - 1);
int left = max - ((1 << j+1) - 1);