以下程序中的位掩码用法来自Programming Pearls

我今天开始阅读“Programming Pearls”,在进行练习时,我遇到了这个问题“你将如何实现自己的位向量?”。 当我查看解决方案时,它是这样的:

#define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1 + N/BITSPERWORD]; void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); 

我对这个陈述感到困惑的地方

  1 << (i & MASK) 

有人可以解释一下这里发生了什么吗?

注意,设置MASK使得它具有最低的SHIFT位设置,其中SHIFT正好是BITSPERWORD的基数2对数。

因此(i & MASK)将选择(i & MASK)的最低5位,这与除以32之后的余数相同(只考虑如何取除十进制数的最低两位数除以100后的余数,例)。 这给出了我们感兴趣的单词中的位数。

1 << (i & MASK)) (顺便说一下, 表达式 ,而不是语句 )现在创建一个值,其中设置了我们感兴趣的位。 使用|=将该值合并到存储器字中将设置位向量的所需位。

0x20是32,所以i & 0x1Fi模32,所以你永远不会移位32位。 这是一种安全措施,因为通过任何不严格小于类型大小的东西进行移位是不确定的行为。