bitset 的定义和初始化:
1、bitset<size> b; //b 有 size 位,每位都是默认值 0
2、bitset<size> b(num); //b 是 unsigned long 型 num 的一个副本
3、bitset<size> b(str); //b 是 string 对象 str 中的位串副本,即 01 字符串
4、bitset<size> b(str, pos); //b 是 str 从位置 pos 开始的位串的副本 (从左往右)
5、bitset<size> b(str, pos, n); //b 是 str 中从位置 pos 开始,向后 n 位的副本
注:位是用来保存一组项或条件的yes/no信息的简洁方法,标准库提供了bitset类使得处理位集合更加方便
bitset 的几个注意点:
1、bitset 最右边为下标开始,而 string 最左边!!!
2、bitset 支持位运算
3、可以通过下标来访问
4、包括函数:all(), any(), none(), test(), set([], []), reset([]), flip([]), size(), count(), to_string(zero, one), to_ullong(), to_ulong()
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main()
{
// bs 为 unsigned long 137 的低 16 位拷贝
// to_ullong or to_ulong 返回相应的值
bitset<16> bs(137);
cout<<bs.to_ullong()<<" 的低 16 位拷贝为:"<<bs<<endl;
// str 的值只能为 0 或 1
string str = "10101101";
bitset<16> bs_t(str);
cout<<"二进制码 "<<str<<" 对应的值为:"<<bs_t.to_ulong()<<endl;
// 从下标为 1 到字符串末尾的拷贝
bitset<16> bs_m(str, 1, str.size());
cout<<"除去二进制码 "<<str<<" 的最高一位后相应的 bitset:"<<bs_m<<endl;
// bitset 支持 IO 流, 下面最多输入 16 个 0 或 1
bitset<16> bs_n;
cout<<"请输入不超过 16 个 0 或 1:";
cin>>bs_n;
cout<<"输入的二进制码的低 16 位为:"<<bs_n<<endl;
// to_string(zero, one) 默认 zero 为 '0',one为 '1'
cout<<"输出二进制码的字符串形式:"<<bs_n.to_string('*', '#')<<endl;
cout<<"输入的二进制码是否有置位了的:"<<boolalpha<<bs_n.any()<<endl;
cout<<"输入的二进制码是否全部置位了:"<<bs_n.all()<<endl;
cout<<"输入的二进制码是否全部没有置位:"<<bs_n.none()<<endl;
// test(index) 会检查下标越界,而 [] 则不检查
cout<<"二进制码的第一位是否被置位了:"<<bs_n.test(0)<<noboolalpha<<endl;
// count() 和 size() 的返回类型为 size_t
cout<<"输入的二进制码有 "<<bs_n.count()<<" 个被置位了"<<endl;
cout<<"输入的二进制码大小为:"<<bs_n.size()<<endl;
// 通过 set(index, flag), reset(index), flip(index) 可实现更详细的操作
cout<<"置位全部二进制码:"<<bs.set()<<endl;
cout<<"复位全部二进制码:"<<bs_n.reset()<<endl;
cout<<"改变全部二进制码:"<<bs_n.flip()<<endl;
system("pause");
return 0;
}