7

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

#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)

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

4

2 回答 2

4

请注意,MASK它设置为具有最低SHIFT位设置,其中SHIFT恰好是 的以 2 为底的对数BITSPERWORD

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

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

于 2011-08-28T03:03:04.333 回答
2

0x20 是 32,所以i & 0x1Fi模 32,所以你永远不会移动 32 位。这是一种保护措施,因为任何不严格小于类型大小的移动都是未定义的行为。

于 2011-08-28T03:06:59.293 回答