编程珠玑第一章


整个程序的思想就是:
            1.每个整数有32位,那么它就可以表示32个数,分别对应每bit位为1.
            2.然后把10000000个数分为1+N/BITSPERWORD组(相当于有这么多个桶),每组包含接近32个数。
上面的解释可能仍不到位,那我们来看具体的函数:
 
对于set函数,我们可以这样理解,
             arr[i>>SHIFT] |= (1<<(i&MASK))可以转化为
             arr[i/32] = arr[i/32] | (1<<(i%32))
i%32必然处于区间[0, 31],那么1<<(i%32)就是将bit位1向前移动(i%32)位,然后和arr[i/32]相或,因而arr[i/32]的第(i%32)位就为1.

#include <stdio.h> #define BITPERWORD #define MASK 0x1F #define N 10000000 #define SHIFT 5 int a[N/BITPERWORD + 1]; void clr_bit(int i){a[i>>SHIFT] &= ~(1 << i & MASK);} void set_bit(int i){a[i>>SHIFT] |= 1<<(i & MASK);} int test_bit(int i){ return a[i >> SHIFT] & (1 << (i & MASK));} int main() { int i = 0; FILE * in = freopen("in.txt","r",stdin); FILE * out = freopen("out.txt","w",stdout); while (scanf("%d",&i) != EOF) { set_bit(i); } for (i = 0;i < 100000 ;++i) { if(test_bit(i)) printf("%d ",i); } fclose(in); fclose(out); //printf("%d ",tmp); return 0; }
原文地址:https://www.cnblogs.com/liuweilinlin/p/3180539.html