bitset
bitset是STL提供的用于记录01串的容器,也就是bitset的每个元素只能为0/1
bitset主要是用于存储二进制位,在需要大量二进制计算的项目中,直接使用bitset比利用数组或者其它方式要更为方便,位运算在存储状态、模拟行动、搜索很多方面有非常巨大的优势。
头文件
1 |
构造函数
1 | bitset<16> first; //构造一个16位的bitset对象,初始值默认为0 |
注意bitset声明后长度不可改变,和数组一样,bitset从0开始编号
如果bitset空间比二进制位数大,则在高位补0,(虽然上面输出是左边为0,但左边是高位,也即其索引分别是15~0)
- 在将整形常量转换为二进制过后,如果bitset位数不够,则自动放弃原数值高位的二进制位。
bitset的操作
以下是bitset常用操作:1
2
3
4
5
6
7
8
9
10
11
12
13a.size() // a的位数
a.any() //a中是否含1
a.none() //a是否全为0
a.all() // a是否全为1
a.count() //a中有几个1
a.[pos] //访问第pos位
a.test(pos) //第pos位是否为1
a.set() //全部设为1
a.reset() //全部清零
a.flip() //全部取反
a.to_ulong() //转成32位无符号整数
a.to_ullong() // 转换为64位无符号整数,如果超出范围则报错
a.to_string() // 转换为string
或者也可以对bitset使用位操作(返回一个bitset):1
2
3
4
5
6a|b
a&b
a^b
~a
a<<1
a>>1
bitset的原理
bitset的原理与高精度压位类似即:
将一个很长的01串按64位一组划分每组01串用一个64位无符号整数记录
bitset所有的操作都是基于对整数的位操作实现的。
所以bitset的效率非常高,可以看作O(N/64)
bitset应用
可以方便利用bitset实现十进制到二进制的互相转换。
二进制转成十进制1
2
3
4
5
6
7
8
9
using namespace std;
int main()
{
bitset<16> a; // 16 bit 二进制数据,还有 bitset<32>
cin >> a;
cout << a.to_ulong() << endl;
return 0;
}
十进制转成二进制1
2
3
4
5
6
7
8
9
10
using namespace std;
int main()
{
int b;
cin >> b;
bitset<16> a(b); // 16 bit 二进制数据,还有 bitset<32>
cout << a<< endl;
return 0;
}