具体案例见编程珠玑第二版第一章开篇,下面是测试的代码:
#include <iostream>
#include <ctime>
using namespace std;
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define MAXNUM 10000 //最大整数
const int num=6000; //整数个数
int length=1 + MAXNUM/BITSPERWORD;
unsigned int *a=new unsigned int[length];
//i>>SHIFT表示i在数组中的下标;1<<(i & MASK))等价于i%32,表示第几个bit
void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); } //将某bit置1
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); } //将某bit置0
//若第0bit为1,返回1;若第3bit为1,则返回8;若第10bit为1,则返回1024
int test(int i) { return a[i>>SHIFT] & (1<<(i & MASK)); }
int main(void)
{
for (int i=0;i!=length;++i)
a[i]=0; //每bit都初始化为0
srand(time(0));
int i=0;
while(i!=num) //生成num个大小不超过MAXNUM的整数
{
int p=rand()%MAXNUM;
if (!test(p))
{
set(p);
++i;
}
}
for (i=0;i<MAXNUM;++i) //按升序打印出这些整数
{
if(test(i))
cout<<i<<endl;
}
return 0;
}
上面的代码只适用整数不重复的情况下。这一章后面的第6题提出一个问题:若每个整数至多只能出现10次该怎么做呢?那就用4位来表示一个整数出现的次数。