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 
#include 
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 _bitmap;
};

void TestBitMap()
{
    BitMap bm(1000);
    bm.Set(1);
    bm.Reset(1);
    bm.Set(2);
    bm.Set(3);
    bm.Set(12);
    cout<1)<cout<2)<

你可能感兴趣的:(数据结构)