C++ STL bitset的用法
1.声明和初始化
std::bitset是STL的一个模板类,模板参数不是类型,而是整型数值,可以像数组一样使用位。
#include<bitset>
std::bitset<8>bs; //声明了以bitset对象bs,bs可以装入8个bit,每一位都初始化为0
bs[0] = 1; //把第0位置1
bs[1] = 0; //把第1位置0
bs[2] = true; //把第2位置1(true转换为1)
bs[3] = false; //把第2位置0(false转换为0)
2.输入/输出
cout << bs << endl; //输出00000101
cin >> bs; //输入01010110,如果输入的不是字符0或1,只取该字符前面的二进制位
cout << bs << endl; //输出01010110
3.bitset与无符号长整型的转换(还可以和unsigned long long int转换,这里不举例了)
unsigned long int value = 23244;
bitset<32>bs(value); //无符号长整型可以用于初始化bs,若整型数值的位数超过bs的位数,只取低位部分
bitset<8>bs8(value);
unsigned long int new_value = bs.to_ulong(); //bitset可以转换为无符号长整型
cout << "value=" << hex << value << endl;
cout << "bs=" << bs << endl;
cout << "bs8=" << bs8 << endl;
cout << "new_value=" << hex << new_value << endl;
4.bitset与字符串的转换
string str = "011001011101";
//也可以用字符串常量代替str
bitset<8>bs1(str); //字符串长度大于bs,只取字符串左边
bitset<16>bs2(str); //字符串长度小于bs,高位补零
bitset<8>bs3(str, 4); //从str中第4个位置开始复制
bitset<8>bs4(str, 3, 6); //从str中第3个位置开始复制6个位,高位剩余位补零
string str1 = bs1.to_string();
string str2 = bs2.to_string();
string str3 = bs3.to_string();
string str4 = bs4.to_string();
cout << "str=" << str << endl;
cout << "bs1=" << bs1 << endl;
cout << "bs2=" << bs2 << endl;
cout << "bs3=" << bs3 << endl;
cout << "bs4=" << bs4 << endl;
cout << "str1=" << str1 << endl;
cout << "str2=" << str2 << endl;
cout << "str3=" << str3 << endl;
cout << "str4=" << str4 << endl;
5.bitset的其他方法
bitset<16>bs("011001011101");
cout << "bs=" << bs << endl;
cout << "bs中是否存在1? " << bs.any() << endl; //any()方法判断是否存在置为1的二进制位
cout << "bs中是否不存在1? " << bs.none() << endl; //none()方法判断是否不存在置为1的二进制位,即全为0
cout << "bs的总位数" << bs.size() << endl; //size()方法计算二进制位数
cout << "bs中1的总位数:" << bs.count() << endl; //count()方法计算二进制中1的位数
cout << "bs第四位是否为1? " << bs.test(4) << endl; //test(size_t pos)方法判断pos位是否为1
cout << "按位取反后bs=" << bs.flip() << endl; //flip()方法将bitset按位取反
cout << "bs第3位取反后bs=" << bs.flip(3) << endl; //flip(size_t pos)将bitset的pos位取反
cout << "bs全置1后bs=" << bs.set() << endl; //set()方法将bs全置1
cout << "bs全置0后bs=" << bs.reset() << endl; //reset()方法将bs全置0
cout << "bs第5位置1后bs=" << bs.set(5) << endl; //set(size_t pos)将bs的第pos位置1
cout << "bs第5位置0后bs=" << bs.reset(5) << endl; //reset(size_t pos)将bs的第pos位置0
6.bs重载的操作符:
[] == != << >> <<= >>= &= |= ^= ~