位图 bitset

来源:互联网 发布:众划算在淘宝算违规吗 编辑:程序博客网 时间:2024/06/06 14:28

Hello,今天Val来分享关于位图的模拟实现。
位图c++中有源码,c++::bitset,它的主要接口有 operator[],set(),reset()、test()等等。
本篇博客主要模拟实现位图的set(),reset(),test()函数.

位图主要是用来标记一个整型的存在与否,如果存在相应的位设置为1,不存在设置为1,它的处理对象为整型,这也是它的局限性,位图标记一个整型是否存在,节省空间/快,1个字节有8个比特位,用比特位上的数字(1和0)表示对应的数是否存在。

优点:节省空间 、快
缺点:只能运用于整型

Set()某个数存在,则把相应位图的位置为1,Reset()去掉某个数,则把相应位图的位置为0.
Test()函数主要是判断一个数是否在位图里面。如何置1和置0?对位进行运算?
这里写图片描述

代码如下:

class BitMap{public:    BitMap(size_t range)    {        _bitMap.resize(range / 8 + 1,0);    }    void  Set(size_t value)    {        size_t index = value / 8;//或者>>3  (2*2*2=8)        size_t pos = value % 8;        _bitMap[index] |= (1 << pos);    }    void  Reset(size_t value)    {        size_t index = value / 8;//或者>>3  (2*2*2=8)        size_t pos = value % 8;        _bitMap[index] &= ~(1 << pos);    }    bool Test(size_t value)    {        size_t index = value / 8;        size_t pos = value % 8;        if (_bitMap[index] & (1 << pos))        {            return true;        }        else        {            return false;        }    }protected:    vector<char> _bitMap;};void TestBitMap(){    //BitMap bm(1024 * 1024 * 1024 * 4);    BitMap bm(-1);//-1 是整数的最大值  知道有多少个数据?方便扩容    bm.Set(1101);    bm.Set(1101);    bm.Set(110001);    bm.Set(1133301);    cout << bm.Test(1101) << endl;    cout << bm.Test(110100) << endl;    cout << bm.Test(110001) << endl;}

位图能快速判断一个整型是否存在,而且很省空间,可是当数据变为其他类型比如string 就无能为力了,布隆过滤器可以解决位图的适用范围只能是整型的问题,之后Val会分享到博客上的。
时间不早了,好梦~

原创粉丝点击