C++:STL------bitset
1.about
bitset可看作一个多位二进制数,每8位占用1个字节,相当于采用了状态压缩的二进制数组,并支持基本的位运算。
在估算程序运行的时间时,一般以32位整数的运算次数为基准,因此n位 bitset 执行一次位运算的复杂度可视为n/32,效率较高。
2.声明和初始化
#include <bitset> //头文件
bitset<10000> b; //表示一个10000位二进制数,<>中填写位数。
bitset<n> b; //b有n位,每位都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(s); //b是string对象s中含有的位串的副本
bitset<n> b(s, pos, n); //b是s中从位置pos开始的n个位的副本
3.位运算操作符
~b:返回对bitset b按位取反的结果。
&, |, ^:返回对两个位数相同的bitset执行按位与、或、异或运算的结果。
>>, <<:返回把一个bitset右移、左移若干位的结果。
==, !=:比较两个bitset代表的二进制数是否相等。
4.[ ]操作符
**b[k]**表示b的第k位,既可以取值,也可以赋值。
在10000位二进制数中,最低位为 b[0] ,最高位为 b[9999] 。
5.method
方法 | 描述 | 实例 | 时间复杂度 |
---|---|---|---|
size | bitset 的长度 | int x = b.size(); | O(1) |
count | 返回有多少位为1 | int y = b.count(); | O(n/w),w一般为64注 |
any | 若所有位都为0,返回false; 若s至少一位为1,返回true | bool a = b.any(); | O(n/w),w一般为64 |
none | 若所有位都为0,返回true; 若s至少一位为1,返回falseb | bool c = b.none(); | O(n/w),w一般为64 |
set | 把所有位变为1; 把第k位改为v,即 b[k] = v | b.set(); b.set(k,v); | O(1) |
reset | 把所有位变为0; 把第k位改为0,即 b[k] = 0 | b.reset(); b.reset(k); | O(1) |
flip | 把所有位取反,即 s = ~s; 把第k位取反,即 b[k]^=1 | b.flip(); b.flip(k); | O(1) |
注:bitset的count操作的复杂度未在C++ Reference 中标注。一般来说,其复杂度为关于bitset位数的线性复杂度,但实际效率可能稍快一些。