我准备采访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;
}
在第一个函数中,我理解(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
小智 6
对于第一个问题:
我们说吧 i = 5
(1 << i )    = 0010 0000 = 32 in base 10
(1 << i ) -1 = 0001 1111 = 31 
所以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
因此,&使用此掩码清除位到索引i