数据结构—位图

来源:互联网 发布:python pil和opencv 编辑:程序博客网 时间:2024/05/10 08:35

在计算机中,每一个数据都是以二进制0/1来保存,每一个字节byte包括8个bit,每一个bit存储一个0/1的信息。
这里写图片描述
一 .为什么使用位图

我们可以通过对每一个bit位的操作来标识一些信息,比如当当前bit为0时,表示不存在,当当前bit为1时,表示存在。
而位图正是利用每一个bit位能标识两种不同的信息。那么我们在构建位图之前,我们先来了解下,在计算机中的位运算。

运算符 含义 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移

二 .如何来构建位图
这里写图片描述
1.首先,我们需要一个数组,这个数组我们拿char类型为例,也就是说,我们数组中的一个元素,有8个bit位,可以存放8个标识。
2.此时我们需要来确定这个数组需要多少元素来标识我们的信息。我们需要计算当前存放类型的大小,
类型大小*8=一个元素可以标识的信息个数接下莱,我们需要知道当前需要存放信息的范围,
范围%一个元素可以标识信息的个数+1=我们需要多少元素
3.最后,我们需要利用位运算符来添加我们存放的数据信息,删除我们存放的数据信息,判断数据是否存在。当前需要操作的数据,先来判断他在哪个数组的元素中位置=当前数据/一个元素可以标识的信息个数),然后来判断他在此元素的几个位位=当前数据%一个元素可以标识的信息个数)。

#include<iostream>#include<vector>using namespace std;template<class T = char>class mapbit{public:    mapbit(size_t data)        :range(sizeof(range) << 3)    {        _mapbit.resize(data / range + 1);    }    void set(size_t data)    {        size_t pos = data / range;        size_t num = data%range;        _mapbit[pos] |= 1 << num;    }    void reset(size_t data)    {        size_t pos = data / range;        size_t num = data%range;        _mapbit[pos] &= ~(1 << num);    }    bool test(size_t data)    {        size_t pos = data / range;        size_t num = data%range;        return(_mapbit[pos] >> num) & 1;    }private:    vector<T> _mapbit;    T range;};int main(){    mapbit<> m1(103);    m1.set(1);    m1.set(8);    m1.set(9);    m1.test(1);    m1.set(103);    m1.reset(1);    m1.reset(9);    m1.reset(8);    cout << m1.test(102) << endl;    return 0;}
原创粉丝点击