一、bitset的定义
类似于vector后面<>中的数据类型,bitset<>括号中记录了长度。
#include <iostream>
#include<bitset>
#include<string>
using namespace std;
int main()
{
//1
bitset<32> i; //初始化一个32位全部为0的数(注意<>内长度必须为1.整形常量 2.已用常量初始化的const对象 )
//i中的位序是从0到31开始
//2
unsigned long i;
bitset<32> j(i)//用i初始化j
//3
string s;
bitset<32> k(s);//k是string对象s中含有的位串的副本
//4
bitset<32> m(s,pos,n);//m是从位置pos开始的n个位的副本
}
二、bitset的初始化
1、用unsigned值初始化
规则:
如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为0;
如果bitet类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。
//例子0xffff在32位机上为 1111 1111 1111 1111 0000 0000 0000 0000
bitset<16> a(0xffff); //a为16位全为1,超出部分的0丢弃
bitset<32> b(0xffff);//b的0到15位全是1,剩下16到31是0,bitset位数32与unsigned long 长度相同
bitset<64> c(0xffff);//bitset为64位大于unsigned long 32, 31到63自动置零
2、用string初始化bitset
规则
从string对象读入位集的顺序是从右向左
string str("1101");
bitset<32> a(str); //a中顺序为1011000..00,超出的位全补零
string s("111111100000111101010111");
bitset<32> b(s,5,4); //从s[5]开始读4位,为1100
bitset<32> c(s,s.size()-4); //读后四位(从s[s.size()-4]一直读到结束
三、bitset的操作
bitset<32> a("10010010");
a.any();//a中是否有1,返回bool变量,有1为true,全为0返回false
a.none();//a中是否没1,true为全0,false为至少有一个1
a.count();//返回a中1的个数
a.size();//返回二进制位数
int k=a[i];//访问a中i处的位
a.set();//将a全置1;
a.set(i);//将a中第i位置1;
a.reset();//将a全置0;
a.reset(i);//将a中第i位置0;
a.flip();//全位取反
a.flip(i);//i位取反
a.to_ulong();//返回a中二进制数的unsigned long数
os<<a;//将a输出到os流
附录:
一个例子
#include <iostream>
#include<string>
#include<stdexcept>
#include<bitset>
using namespace std;
int main()
{
bitset<100> a;
a.set();
//a.to_ulong(); //在try前的错误操作不会抛出异常
try{
a.to_ulong(); //导致溢出的操作
}
catch (exception err){ //处理操作
cout << err.what() << ": 溢出" << endl;
}
//a.to_ulong();//try后的错误操作会抛出异常
unsigned long k=a.to_ulong();
}