目录
1、框架
- bitset能实现对数字的位的操作,同时也能通过类似于数组的下标来访问各个位的数值,以执行相应的操作。模拟bitset就是用一个普通的数组来存储数据以达到模拟的目的。
- 如果我们以一个整型作为比特位的容器,那么如果要求0~N范围的比特位,就需要有
N/32+1个整型来容纳这些比特位,同理如果以char为容器,则需要N/8+1个char来容纳N个比特位。这里我们用vector数组作为底层容纳比特位的容器,且其存储的数据类型为char。namespace cpp { //N个比特位的位图 template<size_t N> class bitset { public: //构造函数 bitset(); //把x映射的位标记成1 void set(size_t x); //把x映射的位标记成0 void reset(size_t x); //判断指定比特位x的状态是否为1 bool test(size_t x); //翻转指定pos void flip(size_t x); //获取位图中可以容纳位N的个数 size_t size() //统计set中1的位数 size_t count(); //判断所有比特位若无置为1,返回true bool none(); //判断位图中是否有位被置为1,若有则返回true bool any(); //全部NUM个bit位被set返回true bool all(); private: vector<char> _bits;//位图 }; }
2、成员函数
构造函数
- 一个char类型有8个bit位,所以理想状态下N个比特位的位图就需要用到N / 8个字节,但仅限于N是8的整数倍,如果N位10,那么计算下来就会少2个比特位,因此综合考虑,我们给出N / 8 + 1个字节,这样算下来,所需的N个比特位绝对都能访问到,最多可以整除的情况下浪费了8个比特位(1字节)
而构造函数,我们只需要对这所有的比特位(N / 8 + 1)个字节的大小初始化为0即可。
//构造函数 bitset() { //+1保证足够比特位,最多浪费8个比特位 _bits.resize(N / 8 + 1, 0); }
set
set的作用是把x映射的位置标记成1,实现规则如下:
- 通过x / 8计算x在第i个char类型
- 通过x % 8计算x在char第j个比特位
- 利用按位或 | 把第i个char中的第j个比特位置为1

最低0.47元/天 解锁文章
2839





