我今天开始阅读“编程珍珠”,在进行练习时,我遇到了这个问题“你将如何实现自己的位向量?”。当我查看解决方案时,它就像这样:
#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)
有人可以解释一下这里发生了什么吗?
答案 0 :(得分:4)
请注意,设置MASK
使其设置的SHIFT
位最低,其中SHIFT
正是BITSPERWORD
的基数2对数。
因此(i & MASK)
将选择i
的最低5位,这与除以32之后的余数相同(只考虑如何取十进制数的最低两位数给出例如,除以100之后的余数。这给出了我们感兴趣的单词中的位数。
1 << (i & MASK))
(顺便说一下,表达式,而不是语句)现在会创建一个值,我们感兴趣的就是已设定。将此值合并到具有|=
的存储器字中将设置位向量的所需位。
答案 1 :(得分:2)
0x20为32,因此i & 0x1F
取i
模32,因此您永远不会移位32位。这是一种安全措施,因为通过任何不严格小于类型大小的东西进行移位是不确定的行为。