前言
位图没啥好说的,实际上就是将一个数组中所有二进制位拆分出来,一个bit
表示一个bool
量主要使用的还是位运算来做,非常简单,一看就会
一、整体思路
- 根据用户需要使用的位图空间,申请一个适量大小的数组;
- 按位获取或设置 每个
bit
位上的数据即可
二、几个易错步骤
1.初始化时
方便起见我将所有类型全设置为了无符号长整型;
用户传入需要的bit
总长度,此时需计算需要创建的数组大小;
- 首先计算类型的
bit
长度:
t y p e S z = 类型占用字节数 ∗ 8 \ typeSz = 类型占用字节数 * 8 typeSz=类型占用字节数∗8 - 接着进行一个向上取整的除法运算,在这里表示为:余数不为0则多申请一个数据空间
mapSz = len / typeSz + (len % typeSz ? 1 : 0);
此时mapSz
就是需要申请的数组大小。
接着申请内存并初始化为0即可。
2.设置位置时
先找到目标位置
使用位运算或 将目标位置设置为1即可。
arr[index / typeSz] |= (1 << (index % typeSz));
3.获取位置时
同样也是找到目标位置;
判断该位置是否是1即可。
(arr[index / typeSz] >> (index % typeSz)) & 1;
三、完整代码
#include <iostream>
#include <cassert>
using namespace std;
class BitMap
{
typedef unsigned long T;
T typeSz;
T* arr = nullptr; //位图数组
T mapSz; //数组大小
T bitLen; //总长度
//初始化
void init(T len)
{
bitLen = len;
typeSz = sizeof(T) * 8;
mapSz = len / typeSz + (len % typeSz ? 1 : 0);
if (arr != nullptr) delete arr;
arr = new T[mapSz];
for (size_t i = 0; i < mapSz; ++i)
arr[i] = 0;
}
public:
//析构函数
~BitMap()
{
if (arr != nullptr) delete arr;
arr = nullptr;
}
//构造函数
BitMap(T len)
{
init(len);
}
//重置位图
void reset(T len)
{
init(len);
}
//设置位置
void set(T index)
{
assert(index < bitLen);
arr[index / typeSz] |= (1 << (index % typeSz));
}
//获取位置
bool get(T index)
{
assert(index < bitLen);
return (arr[index / typeSz] >> (index % typeSz)) & 1;
}
//数组方式获取位置
bool operator[] (T index)
{
return get(index);
}
};