第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;
}