以下程序中的位掩码用法来自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 & 0x1F
取i
模32,所以你永远不会移位32位。 这是一种安全措施,因为通过任何不严格小于类型大小的东西进行移位是不确定的行为。