整个程序的思想就是: 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#define BITPERWORD#define MASK 0x1F#define N 10000000#define SHIFT 5int 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;}