类模板bitset表示一个N位的固定大小的二进制位序列。可以用标准逻辑运算符操作bitset,并将它与字符串和整数相互转换。本篇介绍bitset的一些基本使用方法。
1.bitset的初始化:
#include <bitset>
using namespace std;
int main()
{
//初始化
bitset<8> b0;
bitset<8> b1{0b00101010};//42的二进制字面量
bitset<8> b2{55};
bitset<8> b3{'A'};
bitset<8> b4{0xA};
bitset<8> b5{0xAA};
cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
<< "\nb5 = " << b5 << endl;
cout << "Hello World!" << endl;
return 0;
}
运行结果:
上面显示的初始化数据值都在固定的位数,那么如果我们定义的是8位初始化一个超过8位的数据会取哪一个值呢,比哪biset<8> b6{0XAABB},这个会是什么值呢
#include <bitset>
using namespace std;
int main()
{
//初始化
bitset<8> b0;
bitset<8> b1{0b00101010};//42的二进制字面量
bitset<8> b2{55};
bitset<8> b3{'A'};
bitset<8> b4{0xA};
bitset<8> b5{0xAA};
cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
<< "\nb5 = " << b5 << endl;
bitset<8> b6{0xAABB};
cout << "b6 = " << b6 << endl;
cout << "Hello World!" << endl;
return 0;
}
从结果来看b6显示的10111011,取的是后8位的值。
2.元素访问
访问指定的位 (公开成员函数) | |
访问特定位 (公开成员函数) | |
(C++11) | 检查是否所有、任一或无位被设为 true (公开成员函数) |
返回设置为 true 的位的数量 (公开成员函数) |
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
//元素访问
//operator[]访问指定的位
std::bitset<8> b1{0b00101010}; // 42 的二进制字面量
std::cout << "b1初始化后,b1 持有 " << b1 << endl;
for (std::size_t i = 0; i < b1.size(); ++i)
{
std::cout << "b1[" << i << "]:" << b1[i] << '\n';
}
b1[0] = true; // 通过 bitset::reference 修改第一个位
std::cout << "设置位 0 后,b1 持有 " << b1 << endl;
//test 访问特定位
std::bitset<10> b2("1111010000");
std::size_t idx = 0;
while (idx < b2.size() && !b2.test(idx)) {
++idx;
}
if (idx < b2.size()) {
std::cout << "first set bit at index " << idx << endl;
} else {
std::cout << "no set bits" << endl;
}
//all any none 检查是否所有、任一或无位被设为 true
std::bitset<4> b3("0000");
std::bitset<4> b4("0101");
std::bitset<4> b5("1111");
std::cout << "bitset\t" << "all\t" << "any\t" << "none\n";
std::cout << b3 << '\t' << b3.all() << '\t' << b3.any() << '\t' << b3.none() << '\n';
std::cout << b4 << '\t' << b4.all() << '\t' << b4.any() << '\t' << b4.none() << '\n';
std::cout << b5 << '\t' << b5.all() << '\t' << b5.any() << '\t' << b5.none() << '\n';
//count 返回设置为 true 的位的数量
std::bitset<8> b6("00010010");
std::cout << "initial value: " << b6 << '\n';
// 寻找首个未设置的位
std::size_t idx6 = 0;
while (idx6 < b6.size() && b6.test(idx6))
{
std::cout << "b6.test(" << idx6 << ")= " << b6.test(idx6) << '\n';
++idx6;
}
std::cout << "idx6===== " << idx6 << ": " << b6 << '\n';
// 继续设置位直至 bitset 有一半被填充
while (idx < b6.size() && b6.count() < b6.size()/2)
{
b6.set(idx6);// 从右往左设置
std::cout << "setting bit " << idx6 << ": " << b6 << '\n';
while (idx6 < b6.size() && b6.test(idx6)) ++idx6;
}
cout << "Hello World!" << endl;
return 0;
}
运行结果:
3.容量size();
#include <iostream>
#include <bitset>
#include "bitsetdemo.h"
using namespace std;
int main()
{
cout << bitset<0X400>().size() << endl;
bitset<10> b1;
bitset<'A'> b2;
cout << "b1.size()=======" << b1.size() << endl;
cout << "b2.size()=======" << b2.size() << endl;
cout << "Hello World!" << endl;
return 0;
}
运行结果:
4.修复器
进行二进制与、或、异或及非 (公开成员函数) | |
进行二进制左移和右移 (公开成员函数) | |
将位置为 true 或者提供的值 (公开成员函数) | |
将位置为 false (公开成员函数) | |
翻转位的值 (公开成员函数) |
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
//修改器
//operator&= operator|= operator^= operator~ 进行二进制与、或、异或及非
const std::string pattern_str{"1001"};
std::bitset<16> pattern{pattern_str}, dest;
for (std::size_t i = dest.size()/pattern_str.size(); i != 0; --i)
{
dest <<= pattern_str.size();
dest |= pattern;
std::cout << dest << " (i = " << i << ")\n";
}
std::cout << ~dest << " (~dest)\n";
//operator<<= operator>>= operator<< operator>> 进行二进制左移和右移
std::bitset<8> b7("01110010");
std::cout << "initial value: " << b7 << '\n';
while (b7.any()) {
while (!b7.test(0)) {
b7 >>= 1;
}
std::cout << b7 << '\n';
b7 >>= 1;
}
//set 将位置为 true 或者提供的值
std::bitset<8> b8;
for (size_t i = 1; i < b8.size(); i += 2) {
b8.set(i);
}
std::cout << "b8=================" << b8 << '\n';
//reset 将位置为 false
std::bitset<8> b9(43);
std::cout << "b9 Bitset is " << b9 << '\n';
b9.reset(0);
std::cout << "b9.reset(0) is " << b9 << '\n';
std::bitset<8> b10(42);
std::cout << "b10 Bitset is " << b10 << '\n';
b10.reset(1);
std::cout << "After b10.reset(1): " << b10 << '\n';
b10.reset();
std::cout << "After b10.reset(): " << b10 << '\n';
//flip 翻转位的值
std::bitset<4> b11;
std::cout << "b11===========" << b11 << "\n";
std::cout << "b11.flip(0)===" << b11.flip(0) << '\n';
std::cout << "b11.flip(2)===" << b11.flip(2) << '\n';
std::cout << "b11.flip()====" << b11.flip() << '\n';
cout << "Hello World!" << endl;
return 0;
}
运行结果:
5.转换
返回数据的字符串表示 (公开成员函数) | |
返回数据的 unsigned long 整数表示 (公开成员函数) | |
(C++11) | 返回数据的 unsigned long long 整数表示 (公开成员函数) |
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
//转换
//to_string 返回数据的字符串表示
std::bitset<8> b(42);
std::cout << b.to_string() << '\n'
<< b.to_string('*') << '\n'
<< b.to_string('O', 'X') << '\n';
//to_ulong 返回数据的 unsigned long 整数表示
for (unsigned long i = 0; i < 10; ++i) {
std::bitset<5> b(i);
std::bitset<5> b_inverted = ~b;
std::cout << i << '\t';
std::cout << b << '\t';
std::cout << b_inverted << '\t';
std::cout << b_inverted.to_ulong() << '\n';
}
//to_ullong 返回数据的 unsigned long long 整数表示
std::bitset<std::numeric_limits<unsigned long long>::digits> b11(0x123456789abcdef0LL);
std::cout << "b11====" << b11 << " " << std::hex << b11.to_ullong() << '\n';
b11.flip();
std::cout << "b11====" << b11 << " " << b11.to_ullong() << '\n';
cout << "Hello World!" << endl;
return 0;
}
运行结果:
参考: