【概述】

bitset 位于 <bitset> 头文件中,其是 STL 的一部分,准确地说,bitset 是一个模板类而不是容器,其模板参数不是类型,而整型的数值,即:bitset <N>

bitset 存储的是二进制位,与一个 bool 型的数组相似,其每位只占一个字节,极大的优化了空间,使用 bitset 可以像使用数组一样利用位。

【定义】

bitset 的定义为在定义时必须定义其大小,定义一个空 bitset 时所有值默认为 0

bitset<8> bit1;
bitset<8> bit2(8);
bitset<8> bit3(string("01010101"));
bitset<8> bit4(bit2);cout<<"bit1="<<bit1<<endl;//bit1=00000000
cout<<"bit2="<<bit2<<endl;//bit2=00001000
cout<<"bit3="<<bit3<<endl;//bit3=01010101
cout<<"bit4="<<bit4<<endl;//bit4=00001000

【运算】

bitset 可以直接做位运算

bitset<4> bit1(string("0101"));
bitset<4> bit2(string("1110"));cout<<"(bit1&bit2)="<<(bit1&bit2)<<endl;//(bit1&bit2)=0100
cout<<"(bit1|bit2)="<<(bit1|bit2)<<endl;//(bit1|bit2)=1111
cout<<"(bit1^bit2)="<<(bit1^bit2)<<endl;//(bit1^bit2)=1011
cout<<"(~bit1)="<<(~bit1)<<endl;//(~bit1)=1010cout<<"(bit1&=bit2)="<<(bit1&=bit2)<<endl;//(bit1&=bit2)=0100
cout<<"(bit1|=bit2)="<<(bit1|=bit2)<<endl;//(bit1|=bit2)=1110
cout<<"(bit1^=bit2)="<<(bit1^=bit2)<<endl;//(bit1^=bit2)=0000
cout<<"(bit1<<=1)="<<(bit1<<=1)<<endl;//(bit1<<=1)=0000
cout<<"(bit1^=4)="<<(bit1^=4)<<endl;//(bit1^=4)=0100cout<<"(bit1==bit2)="<<(bit1==bit2)<<endl;//(bit1==bit2)=0
cout<<"(bit1!=bit2)="<<(bit1!=bit2)<<endl;//(bit1!=bit2)=1

【循环移位操作】

由于 bitset 没有循环移位,所以可将循环移位进行拆解,有:

  • 左移 k 位时:先左移 k 位,再右移 m-k 位,最后两者取或,即:(x<<k)|(x>>(m-k))
  • 右移 k 位时:先右移 k 位,再左移 m-k 位,最后两者取或,即:(x>>k)|(x<<(m-k))
bitset<N> left(bitset<N> &x,int val,int len) {//val为移动位数,len为bitset长度return (x<<val)|(x>>(len-val));
}
bitset<N> right(bitset<N> &x,int val,int len) {val为移动位数,len为bitset长度return (x>>val)|(x<<(len-val));
}

【函数】

bitset 没有迭代器,但其函数十分便捷

  • bit.size();//返回长度
  • bit.count();//返回1的个数
  • bit.any();//返回是否有1
  • bit.none();//返回是否没有1
  • bit.set();//全部置为1
  • bit.set(p);//下标从0开始,将p+1的位置为1
  • bit.set(p,n);//将p+1位置为n
  • bit.reset();//全部置为0
  • bit.reset(p);//将p+1位置为0
  • bit.flip();//全部取反等同于(~bit)
  • bit.flip(p);//将p+1位取反
  • bit.to_ulong();//返回转换为unsignedlong的结果,超范围会报错
  • bit.to_ullong();//返回转换为unsignedlonglong的结果,超范围报错
  • bit.to_string();//返回转换为string的结果

C++语言基础 —— STL —— 容器与迭代器 —— bitset相关推荐

  1. C++语言基础 —— STL —— 容器与迭代器

    [概述] STL 是指 C++ 标准模板库,是 C++ 语言标准中的重要组成部分,其以模板类和模版函数的形式提供了各种数据结构与算法的精巧实现,如果能充分使用 STL,可以在代码空间.执行时间.编码效 ...

  2. C++语言基础 —— STL —— 容器与迭代器 —— list 与 deque

    [概述] list 与 deque 是在程序设计中会用到的数据容器,STL 提供了方便的链表.双端队列的实现,准确地说,STL 中的 list 与 deque 不同于 pair.vector 等容器, ...

  3. C++语言基础 —— STL —— 容器与迭代器 —— heap

    [概述] 在 STL 中,并没有将堆作为一种容器,其实现需要借助更低一层的容器组件作为其底层机制,比如:list.priority_queue 等,heap 的底层机制 vector 本身就是一个类模 ...

  4. C++语言基础 —— STL —— 容器与迭代器 —— map 与 multimap

    [概述] map 和 multimap 是映射数据容器,两者均定义与 <map> 头文件中,其所有元素都是 pair,pair 的第一个元素被视为键值,第二个元素为实值. 他们是基于某一类 ...

  5. C++语言基础 —— STL —— 容器与迭代器 —— set 与 multiset

    [概述] set 和 multiset 是集合数据容器,通过链表进行组织,具体实现采用了红黑树的平衡二叉树的数据结构,两者均定义在 <set> 头文件中,其会根据特定的规则,自动将元素排序 ...

  6. C++语言基础 —— STL —— 容器与迭代器 —— vector

    [概述] vector 是定义在 <vector> 头文件中的向量容器模版类,其以连续数组的方式存储元素序列,可以将 vector 看作是以顺序结构实现的线性表. 当在程序中需要使用动态数 ...

  7. C++语言基础 —— STL —— 容器与迭代器 —— pair

    [概述] pair 是定义在 <utility> 头文件中的一个简单的模板类,常用于表示一个二元组或元素对,且其提供了按照字典序对元素对进行大小比较的比较运算符模版函数. 定义: pair ...

  8. C++ [STL容器反向迭代器]

    本文已收录至<C++语言和高级数据结构>专栏! 作者:ARMCSKGT STL容器反向迭代器 前言 正文 适配器 反向迭代器 反向迭代器框架 默认成员函数 反向迭代器的遍历 反向迭代器的比 ...

  9. STL 容器和迭代器连载6_顺序容器的操作3

    2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...

最新文章

  1. Java面试笔试题大汇总三(最全+详细答案)
  2. es6学习 -- 解构赋值
  3. Spark算子总结版
  4. Mysql学习(一)之简单介绍
  5. 小程序之旅——第六站(模板首页)
  6. PV 和 UV IP
  7. 在腾讯云轻量云服务器上搭建mysql数据库
  8. C++中局部变量可以和全局变量重名吗?
  9. BZOJ 1005: [HNOI2008]明明的烦恼
  10. 外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动
  11. rabbitmq 集群 ha负载 Consumer raised exception, processing can restart if the connection factory
  12. 炫酷实用 7款jQuery/HTML5图片应用
  13. 再说409,又提离别痛
  14. 网卡流量监控工具vnstat的使用
  15. 设计模式18_责任链
  16. multipartfile获取文件路径_已知路径,通用获取文件名、后缀、类型
  17. sap系统搭建教程_SAP系统和微信集成的系列教程之一:微信开发环境的搭建
  18. 《大白AI周报》精华内容整理汇总
  19. 餐厅小票打印模板_收银系统小票标签设置
  20. 小程序支持主体迁移了

热门文章

  1. SCSF 系列:Smart Client Software Factory 与 ObjectBuilder
  2. 4637字,看懂从DevOps到DevSecOps的进化之路
  3. 2019升职加薪必备:你一定要修炼的产品思维
  4. STM32之I2C原理
  5. python svm 决策方程_python – 使用scikit-learn线性SVM提取决策边界
  6. 为什么我墙裂建议大家使用枚举来实现单例。
  7. 2019年Java开发者进阶手册.pdf
  8. 美股,港股和A股三者之间的关系和差别
  9. 数据结构拾遗(2) --红黑树的设计与实现(中)
  10. 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题