Binary 位操作破解编码访问
我一直在努力解决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=10001010100Binary 位操作破解编码访问,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
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);