作用
有些程序要处理二进制的有序集,每个位都可能包含0和1值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供的bitset类简化了位集的处理。
声明
#include<bitset>
using namesapce std;
bitset类对象的定义和初始化
类似于vector,bieset类是一种类模板;而与vector不一样的是bitset类型对象的区别在于其长度而不在于其类型。在定义bitset时,要明确bitset有多少位,须在尖括号内给出它的长度值:
初始化bitset类的方法
用unsigned 值初始化bitset对象
当用unsigned long 值作为bitset对象的初始值时,该值将自动转化为二进制的位模式。例:bitset<32> n(15) 。
如果bitset类长度大于unsigned long 值的二进制位数,则其余的高阶位将置为0;如果长度小于 unsigned long 值的二进制位数,则只使用unsigned 值中的低阶位,超过bitset 类型长度的高阶位将被丢弃。
用 string 对象初始化 bitset 对象
当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。从 string 对象读入位集的顺序是从右向左:
string strval("1100");
bitset<32> bitvec(strval);
bitset位模式中第2和第3的位置为1,其余位置为0。
string 对象和 bitset 对象之间是反向转化的:string 对象的最右边字符(即下标最大的那个字符)用来初始化bitset 对象的低阶位(即下标为0的位)。
不一定要把整个string 对象都作为bitset 对象的初始值。相反,可以只用某个子串作为初始值:
string str("1111111000000011001101");
bitset<32> bitvec(str,5,4); //这里用str从str[5]开始包含的四个子符的子串来初始化 bitvec。
botset<32> bitvec(str,str.size()-4); //取出str末尾的四位来对bitvec的低四位进行初始化,其余为初始化为0。
bitset对象上的操作
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
// n有4位且每位都为0
bitset<4> n;
cout << n << endl;
// b有8位,将15转为2进制对b初始化
bitset<8> n(15);
cout << n << endl;
// 有位被设置为1则返回为真,否则返回为假
cout << n.any() << endl;
// n中被设置为1的位的个数
cout << n.count() << endl;
// 反置 0->1 1->0
cout << n.flip() << endl;
// 反置某一位置 从低位开始
cout << n.flip(5) << endl;
// 重置全为0 (也可指定位置)
cout << n.reset() << endl;
// 全部置为1
cout << n.set() << endl;
// n能容纳的位
cout << n.size() << endl;
// 函数返回在pos上的位的值
cout << n.test(2) << endl;
// 函数返回bitset的字符串形式
cout << n.to_string() << endl;
// 返回bitset的无符号长整数形式
// 转化为10进制
cout << n.to_ulong() << endl;
return 0;
}
摘自《C++primer》