• bitset位集学习


     类模板bitset表示一个N位的固定大小的二进制位序列。可以用标准逻辑运算符操作bitset,并将它与字符串和整数相互转换。本篇介绍bitset的一些基本使用方法。

    1.bitset的初始化:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //初始化
    6. bitset<8> b0;
    7. bitset<8> b1{0b00101010};//42的二进制字面量
    8. bitset<8> b2{55};
    9. bitset<8> b3{'A'};
    10. bitset<8> b4{0xA};
    11. bitset<8> b5{0xAA};
    12. cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
    13. << "\nb5 = " << b5 << endl;
    14. cout << "Hello World!" << endl;
    15. return 0;
    16. }

    运行结果:

     上面显示的初始化数据值都在固定的位数,那么如果我们定义的是8位初始化一个超过8位的数据会取哪一个值呢,比哪biset<8> b6{0XAABB},这个会是什么值呢

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //初始化
    6. bitset<8> b0;
    7. bitset<8> b1{0b00101010};//42的二进制字面量
    8. bitset<8> b2{55};
    9. bitset<8> b3{'A'};
    10. bitset<8> b4{0xA};
    11. bitset<8> b5{0xAA};
    12. cout << "b0 = " << b0 << "\nb1 = " << b1 << "\nb2 = " << b2 << "\nb3 = " << b3 << "\nb4 = " << b4
    13. << "\nb5 = " << b5 << endl;
    14. bitset<8> b6{0xAABB};
    15. cout << "b6 = " << b6 << endl;
    16. cout << "Hello World!" << endl;
    17. return 0;
    18. }

     从结果来看b6显示的10111011,取的是后8位的值。

    2.元素访问

    operator[]

    访问指定的位
    (公开成员函数)

    test

    访问特定位
    (公开成员函数)

    all
    any
    none

    (C++11)  

    检查是否所有、任一或无位被设为 true
    (公开成员函数)

    count

    返回设置为 true 的位的数量
    (公开成员函数)
    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //元素访问
    7. //operator[]访问指定的位
    8. std::bitset<8> b1{0b00101010}; // 42 的二进制字面量
    9. std::cout << "b1初始化后,b1 持有 " << b1 << endl;
    10. for (std::size_t i = 0; i < b1.size(); ++i)
    11. {
    12. std::cout << "b1[" << i << "]:" << b1[i] << '\n';
    13. }
    14. b1[0] = true; // 通过 bitset::reference 修改第一个位
    15. std::cout << "设置位 0 后,b1 持有 " << b1 << endl;
    16. //test 访问特定位
    17. std::bitset<10> b2("1111010000");
    18. std::size_t idx = 0;
    19. while (idx < b2.size() && !b2.test(idx)) {
    20. ++idx;
    21. }
    22. if (idx < b2.size()) {
    23. std::cout << "first set bit at index " << idx << endl;
    24. } else {
    25. std::cout << "no set bits" << endl;
    26. }
    27. //all any none 检查是否所有、任一或无位被设为 true
    28. std::bitset<4> b3("0000");
    29. std::bitset<4> b4("0101");
    30. std::bitset<4> b5("1111");
    31. std::cout << "bitset\t" << "all\t" << "any\t" << "none\n";
    32. std::cout << b3 << '\t' << b3.all() << '\t' << b3.any() << '\t' << b3.none() << '\n';
    33. std::cout << b4 << '\t' << b4.all() << '\t' << b4.any() << '\t' << b4.none() << '\n';
    34. std::cout << b5 << '\t' << b5.all() << '\t' << b5.any() << '\t' << b5.none() << '\n';
    35. //count 返回设置为 true 的位的数量
    36. std::bitset<8> b6("00010010");
    37. std::cout << "initial value: " << b6 << '\n';
    38. // 寻找首个未设置的位
    39. std::size_t idx6 = 0;
    40. while (idx6 < b6.size() && b6.test(idx6))
    41. {
    42. std::cout << "b6.test(" << idx6 << ")= " << b6.test(idx6) << '\n';
    43. ++idx6;
    44. }
    45. std::cout << "idx6===== " << idx6 << ": " << b6 << '\n';
    46. // 继续设置位直至 bitset 有一半被填充
    47. while (idx < b6.size() && b6.count() < b6.size()/2)
    48. {
    49. b6.set(idx6);// 从右往左设置
    50. std::cout << "setting bit " << idx6 << ": " << b6 << '\n';
    51. while (idx6 < b6.size() && b6.test(idx6)) ++idx6;
    52. }
    53. cout << "Hello World!" << endl;
    54. return 0;
    55. }

    运行结果:

     

    3.容量size();

    1. #include
    2. #include
    3. #include "bitsetdemo.h"
    4. using namespace std;
    5. int main()
    6. {
    7. cout << bitset<0X400>().size() << endl;
    8. bitset<10> b1;
    9. bitset<'A'> b2;
    10. cout << "b1.size()=======" << b1.size() << endl;
    11. cout << "b2.size()=======" << b2.size() << endl;
    12. cout << "Hello World!" << endl;
    13. return 0;
    14. }

    运行结果:

     4.修复器

    operator&=
    operator|=
    operator^=
    operator~

    进行二进制与、或、异或及非
    (公开成员函数)

    operator<<=
    operator>>=
    operator<<
    operator>>

    进行二进制左移和右移
    (公开成员函数)

    set

    将位置为 true 或者提供的值
    (公开成员函数)

    reset

    将位置为 false
    (公开成员函数)

    flip

    翻转位的值
    (公开成员函数)
    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //修改器
    7. //operator&= operator|= operator^= operator~ 进行二进制与、或、异或及非
    8. const std::string pattern_str{"1001"};
    9. std::bitset<16> pattern{pattern_str}, dest;
    10. for (std::size_t i = dest.size()/pattern_str.size(); i != 0; --i)
    11. {
    12. dest <<= pattern_str.size();
    13. dest |= pattern;
    14. std::cout << dest << " (i = " << i << ")\n";
    15. }
    16. std::cout << ~dest << " (~dest)\n";
    17. //operator<<= operator>>= operator<< operator>> 进行二进制左移和右移
    18. std::bitset<8> b7("01110010");
    19. std::cout << "initial value: " << b7 << '\n';
    20. while (b7.any()) {
    21. while (!b7.test(0)) {
    22. b7 >>= 1;
    23. }
    24. std::cout << b7 << '\n';
    25. b7 >>= 1;
    26. }
    27. //set 将位置为 true 或者提供的值
    28. std::bitset<8> b8;
    29. for (size_t i = 1; i < b8.size(); i += 2) {
    30. b8.set(i);
    31. }
    32. std::cout << "b8=================" << b8 << '\n';
    33. //reset 将位置为 false
    34. std::bitset<8> b9(43);
    35. std::cout << "b9 Bitset is " << b9 << '\n';
    36. b9.reset(0);
    37. std::cout << "b9.reset(0) is " << b9 << '\n';
    38. std::bitset<8> b10(42);
    39. std::cout << "b10 Bitset is " << b10 << '\n';
    40. b10.reset(1);
    41. std::cout << "After b10.reset(1): " << b10 << '\n';
    42. b10.reset();
    43. std::cout << "After b10.reset(): " << b10 << '\n';
    44. //flip 翻转位的值
    45. std::bitset<4> b11;
    46. std::cout << "b11===========" << b11 << "\n";
    47. std::cout << "b11.flip(0)===" << b11.flip(0) << '\n';
    48. std::cout << "b11.flip(2)===" << b11.flip(2) << '\n';
    49. std::cout << "b11.flip()====" << b11.flip() << '\n';
    50. cout << "Hello World!" << endl;
    51. return 0;
    52. }

    运行结果:

     5.转换

    to_string

    返回数据的字符串表示
    (公开成员函数)

    to_ulong

    返回数据的 unsigned long 整数表示
    (公开成员函数)

    to_ullong

    (C++11)

    返回数据的 unsigned long long 整数表示
    (公开成员函数)

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //转换
    7. //to_string 返回数据的字符串表示
    8. std::bitset<8> b(42);
    9. std::cout << b.to_string() << '\n'
    10. << b.to_string('*') << '\n'
    11. << b.to_string('O', 'X') << '\n';
    12. //to_ulong 返回数据的 unsigned long 整数表示
    13. for (unsigned long i = 0; i < 10; ++i) {
    14. std::bitset<5> b(i);
    15. std::bitset<5> b_inverted = ~b;
    16. std::cout << i << '\t';
    17. std::cout << b << '\t';
    18. std::cout << b_inverted << '\t';
    19. std::cout << b_inverted.to_ulong() << '\n';
    20. }
    21. //to_ullong 返回数据的 unsigned long long 整数表示
    22. std::bitsetunsigned long long>::digits> b11(0x123456789abcdef0LL);
    23. std::cout << "b11====" << b11 << " " << std::hex << b11.to_ullong() << '\n';
    24. b11.flip();
    25. std::cout << "b11====" << b11 << " " << b11.to_ullong() << '\n';
    26. cout << "Hello World!" << endl;
    27. return 0;
    28. }

    运行结果:

     

    参考:

    std::bitset - cppreference.com

  • 相关阅读:
    nebula graph调研
    如何使用 MyBatis-Plus 实现公共字段自动填充
    Java毕业设计之spring+springmvc实现的小型云盘网盘管理系统-课设大作业
    制作一个简单HTML西安旅游网页(HTML+CSS)
    JDK动态代理
    Day768.大佬推荐的经典的Redis学习资料 -Redis 核心技术与实战
    【CentOS】Linux 安装 Anaconda 及配置 Jupyter
    浏览器中的音视频知识总结v1.0(工作中需要和视频打交道必看!)
    Dapr v1.10.0 版本已发布
    数据结构-二叉搜索树
  • 原文地址:https://blog.csdn.net/chenyijun/article/details/126184997