这个问题是在编程珠玑的第二道题中提出的。我对它的解决方案感到困惑。
以下是书中写的解决方案。
#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)); }
void clr(int i) { a[i>>SHIFT]&=~(1<<(i & MASK)); }
int test(int i) { return a[i>>SHIFT]&(1<<(i & MASK)); }
我已经在编译器中运行了这个程序,并查看了另一个关于此问题的问题,但我仍然不明白这个解决方案是如何工作的。
为什么要使用a[i>>SHIFT]?为什么不能直接使用a[i]=1;为什么i需要向右移动5次?
a
声明为uint32_t
数组,而不仅仅是int
)。C语言不能保证int
始终是32位宽度,这取决于平台。 - xbug