我正在准备使用盖尔·拉克曼·麦克道威尔(Gayle Laakman McDowell)撰写的文章“破解编码访谈”来进行采访。在涉及位操作的部分中,提供了两个功能,但是我不太了解它是如何工作的。

// 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 << (i+1))中减去1对比特有什么影响?根据我的理解,((1 << (i+1))会产生一个“on”位,向左移i + 1次-将其减去1会得到什么?

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

对于那些偶然有我引用的文本的人,它在第5版的第91页上。

最佳答案

让我们假设i= 5(1 << i)为您提供0100000,将1放置在第6位

所以现在如果我们从中减去1,那么我们得到0011111 ==>仅将第一个5位设置为1,将其他第一个位设置为0,这就是我们获得掩码的方式

结论:对于给定的i(1 << i) -1将为您提供一个掩码,其中i的第一位设置为1,其他位设置为0

09-05 19:10