第三章 标准库string、vector、bitset类型
关于C++的几篇博客,参考人民邮电出版社的《C++ Primer 中文版》一书。
本章着重介绍标准库中的string、vector、bitset类。
第三节 bitset类
bitset是标准库定义的一个表示位集的类。使用该类,需要引用头文件:#include <bitset>
using std::bitset;
一、bitset的构造函数
bitset位集合的编号从0开始,低位同时也是位集合中的低阶位。例: bitset<32> b(0x1111),b的0~15位是1,16~31为是0
构造函数 | 含义 | 举例 |
bitset<n> b | b有n位,默认构造函数将每位都初始化为0 | bitset<32> b |
bitset<n> b(u) | u是unsigned long型,b是u的一个位集副本 | bitset<32> b(65535) bitset<32> b(0xFFFF) |
bitset<n> b(s) | s是string,表示一个位串,b是其副本 | string strval("1100"); bitset<32> b(strval); // b的高位为1,低位为0 |
bitset<n> b(s, pos, n) | b是string s中从位置pos开始的n个位的副本, n缺省时默认是从pos位置到s的末位结束 |
string str("11110010"); bitset<32> b(str, 2, 4); // b为1100 bitset<32> b(str, 2); // b为110010 |
二、bitset 对象的操作
b.any() |
b中是否存在置为1的二进制位? |
b.none() |
b中不存在置为1的二进制位吗? |
b.count() |
b中置为1的二进制位的个数 |
b.size() |
b中二进制位的个数 |
b[pos] |
访问b中在pos处的二进制位 |
b.test(pos) |
b中在pos处的二进制位是否为1? |
b.set() |
把b中所有二进制位都置为1 |
b.set(pos) |
把b中在pos处的二进制位置为1 |
b.reset() |
把b中所有二进制位都置为0 |
b.reset(pos) |
把b中在pos处的二进制位置为0 |
b.flip() |
把b中所有二进制位逐位取反 |
b.flip(pos) |
把b中在pos处的二进制位取反 |
b.to_ulong() |
用b中同样的二进制位返回一个unsigned long值 |
os << b |
把b中的位集输出到os流 |
其中:
1、count:返回类型为标准库中定义的size_t类型(与机器相关的unsigned类型),该类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本。
2、flip:flip操作可以对bitset对象的所有位或个别位取反
b.flip()是对b的所有位取反
b[0].flip() 和 b.flip(0) 两种方式等价,都是对b的第0位取反
3、to_ulong:当且仅当bitset类型的长度不超过unsigned long型的长度时,才可以使用该操作。
4、一则经验性的总结:bitset类比整型值上的低级位操作更容易使用。P135页,第5.3.1小节《bitset对象或整型值的使用》,举了一个非常好的例子,用来比较它俩的差异。