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

时间:2011-08-28 02:56:51

标签: c mask bit 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)

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

2 个答案:

答案 0 :(得分:4)

请注意,设置MASK使其设置的SHIFT位最低,其中SHIFT正是BITSPERWORD的基数2对数。

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

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

答案 1 :(得分:2)

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