bitset定义和初始化
int n = nums.size();
const int n = nums.size();
bitset<n> testBitset1; // 以上两种方式n取值均会报错 error
bitset<N> testBitset2; // ok 此处N为常量
编译器报错
error: the value of 'n' is not usable in a constant expression
原因
要求bitset
大小N
必须是常量表达式,即初始化N
的表达式不能包含任何变量/未知值的常变量。
这样要求是因为编译器在编译时需要为bitset
变量 (静态地)申请内存,必须要知道bitset
变量的长度/位数。(另外bitset变量实际上是按照字节数存储,如N=7
时,sizeof
长为1 Byte
,即8bit
。)
类比-静态数组:C++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。
//int n = 1; // error,n不是常量
const int n = 1; //ok,n是常量
bitset<n> testBitSet1;
//int m=0; // error,m不是常量
const int m = 0;
const int n = m + 1;
bitset<n> testBitSet2;
int n = nums.size(); // error,nums.size()不是常量
// 尽管nums.size()函数返回值本身是const类型,
// 但在编译时编译器无法得知具体值。
bitset<n> testBitset3;
bitset的初始化方式
bitset<8> testBitset1; // 构造长度为8的bitset,所有bit都默认初始化为0:00000000
bitset<12> testBitset2(0xe5); // 根据所给值初始化低n位:000011100101
bitset<12> testBitset3(string("10111001")); // 根据给定0/1字符串初始化低位:000010111001
// 字符串中包含非0/1字符会报错
注意:bitset
的pos
最右端是pos = 0
,最低位。从右到左,从0
到size()-1
,从低到高。
bitset常用成员函数
set(pos)
:给指定pos
位置1reset()
:给指定pos
位置0flip()
或flip(pos)
:0/1
反转全部bit
位或指定pos
处的bit
位test(pos)
:判断指定pos
位的值是否是1count()
:bitset
中被置1的个数size()
:bitset
的大小/长度any()
:判断是否有任一bit
都被置1none()
:判断是否所有bit
都被置0all()
:判断是否所有bit
都被置1
bitset的应用
- 海量的非重复数据中判断存在与否 的0-1问题
- 便于利用bitset重载的位运算操作符的应用,
&
、|
、^
等