编程珠玑第一章
整个程序的思想就是:
1.每个整数有32位,那么它就可以表示32个数,分别对应每bit位为1.
2.然后把10000000个数分为1+N/BITSPERWORD组(相当于有这么多个桶),每组包含接近32个数。
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.
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\n",i); } fclose(in); fclose(out); //printf("%d\n",tmp); return 0; }
一切源于对计算机的热爱