BitMap的实现

#pragma once 
#include<iostream>
#include<vector>
using namespace std;
//哈希  -》 位图 -》布隆过滤器
//位图:类似于哈希表的直接定址法插入数据,但位图只能用来表示数据的存在状态。
//本来由一个或多个字节表示的数,此时将有一个位来表示其 是否存在,,适合于大数据查找某个数的存在状态
class BitMap
{
public:
    BitMap(size_t range)             //由数的最大范围得到所需的最少字节+1
        :_sz(0)             
    {                                 //移位运算符优先级很低
        _v.resize((range >> 5) + 1);  //之所以除32,本来4个字节可以表示一个数,此时4个字节可以表示32个数,数的表示扩大了32倍,那么开辟的空间就可以减少32倍
        cout << "字节数:" << _v.size() << endl;
    }

    void Set(size_t num) 
    {
        size_t index = num>>5;                     //得到该数在位图属于第几个字节
        size_t bit = num % 32;                      //得到该数在该字节的  第几位

        _v[index] |= (1<<bit);              /* 1 : 第0位   。该坐标对应num
                                            所在的字节中对应的位设置为存在;*/
        _sz++;
    }
    void Reset(size_t num)
    {
        size_t index = num >> 5;                      
        size_t bit = num % 32;  

        _v[index] &= ~(1<<bit);
        _sz--;
    }
    bool Test(size_t num)
    {
        size_t index = num >> 5;
        size_t bit = num % 32;
        return _v[index] & (1<<bit);
    }


protected:
    vector<size_t> _v;
    size_t _sz;
};

void BitMapTest()
{
    BitMap bm(142);

    for (int i = 70; i <142; i++)
    {
        bm.Set(i);
    }
    cout << bm.Test(75) << endl;
    cout << bm.Test(71) << endl;
    cout << bm.Test(5) << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值