位图排序示例

位图排序示例第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;

}