1:简单通俗来讲就是速度非常之快
以字节为单位,用一位一位寻找
#include <iostream>
using namespace std;
//加载数据
//就是将能被3整除的位设置为:1
void init(char* data, int len) {unsigned int n = len * 8;for (unsigned i = 0; i < n; i++){if (i%3==0){//判断能被3整除的数在不在位图中char *p = data + i / 8;//不在第一个字节中,就移动到下一个字节 9/8 = 1个字节*p = *p | (1 << (i % 8));//9%8=1,左移一位}}
}
//通过上述的位,来判断:位为1 那么这个数据肯定就在这个位图中
bool check(char* data, int len, int values) {char* p = data + values / 8;return *p & (1 << values % 8);
}int main(void) {//定义40亿个数unsigned int n = 4000000000;int len = n / 8 + 1;//+1是保证至少有一个字节char* data;data = new char[len];//初始化数据init(data,len);int input = 0;while (1){cout << "请输入一个数[输入-1退出]:" << endl;cin >> input;if (input == -1){break;}if (check(data,len,input)){cout << input << " :在集合中" << endl;}else {cout << input << " :不在集合中" << endl;}}system("pause");
}