#define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1+ N/BITSPERWORD]; void set(int i) { a[a>>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)) ; }
int a[1+ N/BITSPERWORD]; 就是把n个数分成1+ N/BITSPERWORD个数组,数组每个元素可以表示32个数,分别对应每bit位为1. 这样就可以表示10 000 000个整数
比如说 整数为 1234,先找一下在第几组 1234/32= 39余16 ,那么就是在a[39]的第15位是1. 这个1就相当于在特别大的比特组中第1234位是1(也就是存在这个数).
根据这个返回再看算法是不是一目了然