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;
}
posted @ 2023-03-12 00:56  盧倫  阅读(46)  评论(0)    收藏  举报