类模板bitset表示一个N位的固定大小的二进制位序列。可以用标准逻辑运算符操作bitset,并将它与字符串和整数相互转换。本篇介绍bitset的一些基本使用方法。
1.bitset的初始化:
- #include
-
- 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
-
- 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
- #include
-
- 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
- #include
- #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
- #include
-
- 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
- #include
-
- 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
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;
- }
-
运行结果:

参考: