STL - bitset 基础
Bitset 基础:
关于Bitset容器:
有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些
1、定义和初始化:
bitset<n> b; //b有n位,每位都为0 bitset<n> b(u); //b是unsigned long型u的一个副本 bitset<n> b(s); //b是string对象s中含有的位串的副本 bitset<n> b(s, pos, n); //b是s中从位置pos开始的n个位的副本 注意: 类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值: //用unsigned值初始化bitset对象 bitset<32> bitvec(0xffff); //用string对象初始化bitset对象 string strval("1100"); bitset<32> bitvec4(strval); //子串作为初始值 string str("1111111000000011001101"); bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100 bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters
2、其他操作:
bitset<32> bit(10); bit.any(); //bit中是否存在置为1的二进制位(1表示存在,0表示不存在) bit.none(); //bit中是否不存在置为1的二进制位(1表示不存在,0表示存在) bit.count(); //bit中置为1的二进制位的个数 bit.size(); //bit中二进制的个数 bit[pos]; //访问bit中在pos处的二进制位 bit.test(pos); //bit中pos处的二进制位是否为1 bit.set(); //把bit中所有二进制位都置为1 bit.set(pos); //把bit中pos处的二进制位置为1 bit.reset(); //把bit中所有的二进制位都置为0 bit.reset(pos); //把bit中在pos处的二进制位置为0 bit.flip(); //把bit中所有的二进制位逐位取反 bit.flip(pos); //把bit中在pos处的二进制位取反 bit.to_ulong(); //返回一个unsigned long的值 os << bit; //把bit中的位输出到os流中
3、程序实例:
#include <iostream> #include <bitset> using namespace std; int main(){ //bitset 使用整数初始化bitset bitset<3> bs(7); //输出bs各个位的值 cout<<"bs[0] is "<<bs[0]<<endl; cout<<"bs[1] is "<<bs[1]<<endl; cout<<"bs[2] is "<<bs[2]<<endl; //下面的语句会抛出outofindexexception //cout<<"bs[3] is "<<bs[3]<<endl; //使用字符串初始化bitset //注意:使用string初始化时从右向左处理,如下初始化的各个位的值将是110,而非011 string strVal("011"); bitset<3> bs1(strVal); //输出各位 cout<<"bs1[0] is "<<bs1[0]<<endl; cout<<"bs1[1] is "<<bs1[1]<<endl; cout<<"bs1[2] is "<<bs1[2]<<endl; //cout输出时也是从右边向左边输出 cout<<bs1<<endl; //bitset的方法 //any()方法如果有一位为1,则返回1 cout<<"bs1.any() = "<<bs1.any()<<endl; //none()方法,如果有一个为1none则返回0,如果全为0则返回1 bitset<3> bsNone; cout<<"bsNone.none() = " <<bsNone.none()<<endl; //count()返回几个位为1 cout<<"bs1.count() = "<<bs1.count()<<endl; //size()返回位数 cout<<"bs1.size() = "<<bs1.size()<<endl; //test()返回某一位是否为1 //flip()诸位取反 bitset<3> bsFlip = bs1.flip(); cout<<"bsFlip = "<<bsFlip<<endl; //to_ulong(转换为10进制) unsigned long val = bs1.to_ulong(); cout<<val; }

浙公网安备 33010602011771号