//注意注意数据类型
#include<iostream>
#include<windows.h>
using namespace std;
void init(char *data,int len ){
//一共有n个数
unsigned int n = len * 8;
for (unsigned int i = 0; i < n;i++) {
if(i%3==0){
//如果这个集合范围i能被3整除 就设置在这个集合当中
//找到所在字节
char* p = data + i / 8;
//找到所在的位 1左移i%8位 位或这个位置 1或等于添加
*p = *p|(1 << (i % 8));
}
}
}
bool check(char *data,unsigned int value){
char* p = data + (value / 8);
//用1左移到这个数的位 用位与检查结果 1&1为真 其他为假
bool ret = *p&(1 << (value % 8));
return ret;
}
int main(void){
/*
练习:位图算法
有很多不重复的整数, 其中最大值不超过40亿, 最小值是0.
要求判断某个指定的整数, 是否在这个集合中
*/
//设置最大数
unsigned int n = 4000000000;
//分配位图内存空间
int len = n / 8+1 ; //需要的字节数
//分配内存 并用一个指针指向这块内存
char* data = (char*)malloc(len);
//将内存值初始化为0
memset(data,0,len);
//假设能被三整除的数 就设为在这个数据集合当中
init(data,len);
//输入要查询的数字 并检查是不是在集合中
while (1) {
unsigned int value;
cout << "要查询的数:";
cin >> value;
if (value==-1) {
break;
}
if (check(data,value)==1) {
cout << value << "在数据集合当中" << endl;
}
else {
cout << value << "不在数据集合当中" << endl;
}
}
system("pause");
return 0;
}