1. 程式人生 > >bitmap(點陣圖)

bitmap(點陣圖)

1.什麼是點陣圖?

來自於《程式設計珠璣》。所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由於採用了Bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

比如:
申請一個int型的空間,則有4Byte,32bit。輸入1,2 , 3 ,4
0000 0000 0000 0000 0000 0000 0000 0000
輸入1
0000 0000 0000 0000 0000 0000 0000 0010
輸入2
0000 0000 0000 0000 0000 0000 0000 0110
輸入3
0000 0000 0000 0000 0000 0000 0000 1110
輸入4
0000 0000 0000 0000 0000 0000 0001 1110

2.map對映表

假設需要排序或者查詢的範圍0~1000,那麼我們需要申請的記憶體空間為 int a[N/32 + 1].其中a[0]在記憶體中佔32位,依此類推:
bitmap表為:
a[0] 0~31
a[1] 32~63
a[2] 64~95
a[3] 96~127

3.位移轉換

(1) 求十進位制數0-N對應的在陣列a中的下標
index= N / 32即可,index即為n對應的陣列下標。

(2)求十進位制數0-N對應的bit位
pos = N % 32即可

(3)利用移位0-31使得對應的32bit位為1

4.程式碼實現(c++)

#pragma once
#include <iostream>
#include <vector>
using namespace std;

class BitMap
{
public:
    BitMap(size_t range)   //給定點陣圖所能表示的 範圍
    {
        _bitmap.resize(range / 32
+ 1); //設定大小 } void Set(size_t num) //置 1 { size_t index = num / 32; //所在下標 size_t pos = num % 32; //所在位置 _bitmap[index] |= (1 << pos); } void Reset(size_t num) //置 0 { size_t index = num / 32; size_t pos = num % 32; _bitmap[index] &= (~(1
<< pos)); } bool Test(size_t num) //返回狀態位 { size_t index = num / 32; size_t pos = num % 32; return _bitmap[index] & (1 << pos); } protected: vector<size_t> _bitmap; }; void TestBitMap() { BitMap bm(1000); bm.Set(1); bm.Reset(1); bm.Set(2); bm.Set(3); bm.Set(12); cout<<bm.Test(1)<<endl; cout<<bm.Test(2)<<endl; }