您好,登錄后才能下訂單哦!
第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;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。