天天看点

C++的bitset

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;
}