位图
位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。
位图其实是用数组实现的,数组的每一个元素的每一个二进制位都可以表示一个数据在或者不在,0表示数据存在,1表示数据不存在。因为比特位只有两种状态,要不是0,要不就是1,所以位图其实就是一种直接定址法的哈希,只不过位图只能表示这个值在或者不在。 如下图所示:
当我们探测到25比特位的值为1时,我们就可以判断出136这个数据存在。
位图的实现(主要接口)
set:将对应的比特位置1操作
void set(size_t x)
{
//size_t index = x / 8;//计算是数组的第几个段
size_t index = x >> 3;
size_t num = x % 8;//计算是这个段的第几个位
//把对应的比特位置为1
_bit[index] |= (1 << num);
}
reset:将对用的比特位置0操作
void reset(size_t x)
{
size_t index = x >> 3;
size_t num = x % 8;
//把对应的比特位置为0
_bit[index] &= (~(1 << num));
}
test:判断对应的比特位是0(不存在)还是1(存在)
bool test(size_t x)
{
//判断对应位是0还是1
size_t index = x >> 3;
size_t num = x % 8;
return _bit[index] & (1 << num);//与完之后的结果如果非零就说明存在,为零说明不存在
}
完整代码
bitset.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class bitset
{
public:
bitset(size_t bitnum)//开多少位
:_bitnum(bitnum)
{
_bit.resize((bitnum >> 3)+1, 0);//除8+1是确定数组开多大,数组中的每一个元素都可以标识8个数据
}
void set(size_t x)
{
//size_t index = x / 8;//计算是数组的第几个段
size_t index = x >> 3;
size_t num = x % 8;//计算是这个段的第几个位
//把对应的比特位置为1
_bit[index] |= (1 << num);
}
void reset(size_t x)
{
size_t index = x >> 3;
size_t num = x % 8;
//把对应的比特位置为0
_bit[index] &= (~(1 << num));
}
bool test(size_t x)
{
//判断对应位是0还是1
size_t index = x >> 3;
size_t num = x % 8;
return _bit[index] & (1 << num);//与完之后的结果如果非零就说明存在,为零说明不存在
}
private:
vector<char> _bit;
size_t _bitnum;
};
void test_bitset()
{
bitset bs(10000);
bs.set(6666);
bs.set(666);
bs.set(66);
bs.set(6);
cout << bs.test(6) << endl;//存在
cout << bs.test(66) << endl;//存在
cout << bs.test(666) << endl;//存在
cout << bs.test(6666) << endl;//存在
cout << bs.test(16) << endl;//不存在
}
test.cpp
#include "bitset.h"
int main()
{
test_bitset();
system("pause");
return 0;
}