这种表示法一般符合3个属性:
1、输入范围相对要小
2、不包含重复数据
3、没有数据与单个整数(主键)以外的每一记录相关联
Jon Bentley给出的实现
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1f
#defien N 10000000
//如果要连续的静态内存空间 还是数组比较好 我用的时候用的是malloc
//感觉没有数组好 而且 malloc还容易忘free
int a[1+N/BITSPERWORD];
//我自己写的时候 用的是 i/32 和 i%32 明显没有大师用的好
//对于地址相关型数据的操作 还是位操作 显得灵便 效率更高
void set(int i) { a[i>>SHIFT ] |= (1<<(i & MASK)); }
void clr(int) { a[i>>SHIFT ] &= ~(1<<(i & MASK)); }
void test(int i){ return a[i>>SHIFT] & (i<<(i & MASK)); }
int main(void)
{
int i;
for(i = 0; i < N; i++)
clr(i);
while(scanf("%d",&i) != EOF)
set(i);
for(i = 0; i < N; i++)
if(test(i))
printf("%d\n",i);
return 0;
}