C++ 中的 \(\textsf{bitset}\) 是能够存储 \(01\) 的容器,这一点看似与布尔(bool)数组很像。而一个布尔类型将会占用 \(1\) 字节的空间,相对于 \(\textsf{bitset}\) 来讲 \(1\) 字节的空间将可以存储 \(8\) 位的 \(01\)。
使用 \(\textsf{bitset}\)
和一般的 STL 一样,需要一个特定的头文件进行引用,但是它并不属于 STL 的哪一类。
#include <bitset>
$ $
\(\textsf{bitset}\) 的相关使用
1、定义
bitset <10010> BS; //10010 作为bitset的大小,下标从0开始算起,BS中都为0
bitset <10010> BS(val); //同样是 10010 位的bitset,而bitset中以及有了 val 的二进制数
// 例如,bitset <4> BS(3) 中BS的值为 0011
const string str = "101"; // str 作为一个【字符串常量】是一个01串!
bitset <10010> BS(str); // 例如,str = "101", bitset <4> BS(str) 中BS的值为 0101
bitset <10010> BS(string("101"));// 或者也可以这样写
对于整数来说,当 \(\textsf{bitset}\) 的大小小于 \(\textsf{val}\) 的值得时候,会只存入 \(\textsf{val}\) 的后面的二进制数,就像是 \(9(2) = 1001\), 而 bitset <3> BS
中的元素仅会是 \(001\)。
对与字符串来说,恰恰相反:const string str = "110101";
bitset <6> BS; // BS的值为 110101
bitset <5> BS; // BS的值为 11010
bitset <4> BS; // BS的值为 1101 ...
它是从前往后存的。
还有,bitset <10010> BS(0)
和 bitset <10010> BS
,均可使初始化为 \(0\)。
$ $
2、运算
- \(\textsf{bitset}\) 能与数组一样将每个元素进行调用,例如:当
BS
的值为 \(010110\) 时,BS[0] = 0, BS[1] = 1, BS[2] = 1, BS[3] = 0, BS[4] = 1, BS[5] = 0}
- \(\textsf{bitset}\) 可以用于
&、|、^、~、&=、|=、^=、>>、<<、>>=、<<=
的各种逻辑、位运算操作,但是两个对象仅能为 \(\textsf{bitset}\)。
若两个 \(\textsf{bitset}\) 的大小不一样,那么这两个 \(\textsf{bitset}\) 是无法做到位运算的。
对于左移右移超过了其最大位,也只会保留最后的没有超过的位数。
-
\(\textsf{bitset}\) 可以用
==、!=
与其他变量进行比较,返回false
/true
。(与实数比较时,会默认将实数当做整数比较) -
\(\textsf{bitset}\) 流运算符,这意味着你可以通过
cin
/cout
进行输入输出。
$ $
3、成员函数
使用 | 作用 |
---|---|
BS.count() |
返回 true 的数量 |
BS.any() |
若存在某一位是 true 则返回 true ,否则返回 false |
BS.none() |
若所有位都是 false 则返回 true ,否则返回 false |
BS.all() |
若所有位都是 true 则返回 true ,否则返回 false |
BS.size() |
返回 bitset 的大小 |
BS._Find_first() |
返回 bitset 第一个 true 的下标,若没有 true 则返回 bitset 的大小 |
BS._Find_next(pos) |
返回 pos 后面(严格)第一个 true 的下标,若 pos 后面没有 true 则返回 bitset 的大小 |
使用 | 作用 |
---|---|
BS.set() |
将整个 bitset 设置成 true |
BS.set(pos,true/false) |
将某一位设置成 true/false |
BS.reset() |
将整个 bitset 设置成 false |
BS.reset(pos) |
将某一位设置成 false 。相当于 set(pos, false) |
BS.flip() |
翻转每一位,相当于异或一个全是 \(1\) 的 bitset |
BS.flip(pos) |
翻转某一位 |
使用 | 作用 |
---|---|
BS.to_string() |
返回转换成的字符串表达 |
BS.to_ulong() |
返回转换成的 unsigned long 表达 |
BS.to_ullong() |
返回转换成的 unsigned long long 表达 |