位向量:用位来存储一个数,例如N=10000000个数,每一位代表一个数
定义一个int类型的数组int a[N],如果a[9]=1,则代表文件中存在一个值为9,不过由于这里我们定义的是int,一个int是4字节,也就是32位,有效利用这个32位的可以缩减实际所开数组大小的'N'值,这里实际上也就只用开到int [n>>5]; 这样每一个数组的值,例如:
a[0]代表了0-31; a[1]代表了32-63...依次类推
而隐藏掉的32位需要通过特定手段找回来才能确定具体代表的是哪一个值,由mask=31,与i值相与可以得到末尾的那32位值,由此再通过(1<<(mask&i))就可以表达出是该组中的32个数中的哪一个数
这样
void set(int i){ a[i>>SHIFT] |= (1<<(i & MASK) ); }
void clr(int i){ a[i>>SHIFT] &= ~(1<<(i&MASK) ); }
void test(int i){ return a[i>>SHIFT]&(1<<(i&MASK) ); }