第0行

第1行(32-63),依次类推。

C++代码如下:

/** @file Bitmap

* @copyright personal

* @brief 接口头文件

* @version v1.0.0

* @author fangyuan

* @date 2015/10/20

* @note 测试版本

*/

#include "iostream"

#include <math.h>

#include "vector"

#define INT_BYTES sizeof(int) //int型所占字节

#define INT_BITS (8*INT_BYTES) //int型所占位数

#define MAXNUM (1024*1024*1024) //最大数

#define SHIFT_BIT (int)(log(double(INT_BITS))/log(double(2))) //最大移位数,左移一位等价于*2,即最大^SHIFT_BIT

#define MASK (INT_BITS-1) //根据int类型变化,一般为31

using namespace std;

//int bitmap[MAXNUM/INT_BITS]; //超出数组范围定义

vector<int> bitmap(MAXNUM/INT_BITS); //自动初始化为,若非C++,可自定为list;

void set(int i)

{

//i>>SHIFT_BIT等价于i/INT_BITS,i & MASK等价于i%MASK,取余的分母一般为^n-1

bitmap[i>>SHIFT_BIT] |= 1<<(i & MASK); //当前位,置为1,再进行或运算

}

//获取第i行,第j列

bool get(int i,int j)

{

//return (bitmap[i>>SHIFT_BIT] & 1<<(i & MASK));

return (bitmap[i] & 1<<(j & MASK));

}

int main()

{

set(2);

set(3);

set(50000000);

set(100);

set(50);

//不按数字遍历,按行遍历,减少遍历次数

for(int i = 0; i < bitmap.size(); ++i)

{

if( !bitmap[i] )

{

continue;

}

for(int j = 0; j <= MASK;++j)

{

bool result = get(i,j);

if(result)

{

cout << i*INT_BITS+j << endl;

}

}

}

system("pause");

return 0;

}