C++ bitset

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字符会报错

注意bitsetpos最右端是pos = 0,最低位。从右到左,从0size()-1,从低到高。

bitset常用成员函数

  1. set(pos):给指定pos位置1
  2. reset():给指定pos位置0
  3. flip()flip(pos)0/1反转全部bit位或指定pos处的bit
  4. test(pos):判断指定pos位的值是否是1
  5. count()bitset中被置1的个数
  6. size()bitset的大小/长度
  7. any():判断是否有任一bit都被置1
  8. none():判断是否所有bit都被置0
  9. all():判断是否所有bit都被置1

bitset的应用

  1. 海量的非重复数据中判断存在与否0-1问题
  2. 便于利用bitset重载的位运算操作符的应用,&|^
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值