位操作:清除位范围

11 c bit-manipulation

我准备采访Gayle Laakman McDowell撰写的文章"Cracking the Coding Interview".在涉及位操作的部分,提供了两个函数,但我不太明白它是如何工作的.

// To clear all bits from the most significant bit through i (inclusive), we do:
int clearMSBthroughI(int num, int i) {
    int mask = (1 << i) - 1;
    return num & mask;
}

// To clear all bits from i through 0 (inclusive), we do:
int clearBitsIthrough0(int num, int i) {
    int mask = ~(((1 << (i+1)) - 1);
    return num & mask;
}
Run Code Online (Sandbox Code Playgroud)

在第一个函数中,我理解(1 << i)当然是什么,但我不确定的是从这个值中减去1如何影响位(即(1 << i) - 1)).

我基本上和第二个功能有同样的困惑.有什么影响,特别是对比特,减去1 ((1 << (i+1))有多少?根据我的理解,((1 << (i+1))结果是单个"开"位,向左移动i + 1次 - 用1减去这个数字是多少?

谢谢,我希望这很清楚!如果还有其他问题,请告诉我.

对于那些偶然有我正在引用的文本的人来说,它是在第5版的第91页.

MOH*_*MED 25

我们假设 i= 5

(1 << i)给你01000001放在第6位的位置

所以现在如果我们减去1它,那么我们得到0011111==>只有5个第一位被设置为1,其他被设置为0,这就是我们如何得到我们的面具

结论:为了给出i 一个(1 << i) -1将给你一个掩码,其中i第一个位设置为1和其他设置为0

  • @tomasyany它遵循二进制计数的方式:0,1,10,11,100,101,110,111,1000,......等等.请注意,当您从任何100 ... 00数字向后退一步时,您会得到一个少11位的11..11. (3认同)

小智 6

对于第一个问题:

我们说吧 i = 5

(1 << i )    = 0010 0000 = 32 in base 10
(1 << i ) -1 = 0001 1111 = 31 
Run Code Online (Sandbox Code Playgroud)

所以a &使用这个掩码将最重要的位清除到i,因为上面和包括index的所有位位置i都是0,任何波纹管都是1.

对于第二个问题:

再说一遍 i = 5

  (1 << (i + 1))      = 0100 0000 = 64 in base 10
  (1 << (i + 1)) - 1  = 0011 1111 = 63
~((1 << (i + 1)) - 1) = 1100 0000 = 192
Run Code Online (Sandbox Code Playgroud)

因此,&使用此掩码清除位到索引i