zoukankan      html  css  js  c++  java
  • 简单而强大的bitset

    简单而强大的bitset

    介绍

    有些程序需要处理二进制有序集,标准库提供了bitset 类型,事实上,bitset 是一个二进制容器,容器中每一个元素都是一位二进制码,或为 0,或为 1。

    基础

    • bitset所在的头文件
    • 命名空间std
    • bitset属于非类型模板参数
    • bitset<>模板类虽然重载了中括号运算符,bs[0]表示的是将该数值转换为二进制时的最末尾元素,而非首位(其意义和数组并不相同)。
     std::bitset<8> bs;
    //bs[0] = 1;            // 0000 0001
    //bs[7] = 1;            // 1000 0000
    

    使用

    #include <bitset>
    using std::bitset;
    

    定义与初始化

    在定义 bitset 时,要明确 bitset 有多少位,这个位数是整形常量

    bitset<n> b;    //b 有 n 位,每位都是 0
    bitset<n> b(u); //b 是 unsigned long(int) 型 u 的一个副本
    bitset<n> b(s); //b 是 string 对象 s 中含有的位串的副本,这个s 必须是位串,也就是二进制码串
    bitset<n> b(s, pos, n); //b 是 s 中 从位置 pos 开始的 n 个位的副本
    

    bitset 的操作

    b.any()           //b 中是否存在置为 1 的二进制位? 
    b.none()          // 和b.any() 效果一样
    b.count()         //b 中值为 1 的二进制位的个数
    b.size()          //b 包含多少个二进制位
    b[pos]            //访问 b 中在 pos 处二进制位 
    b.test(pos)       //b 中在 pos 处的二进制位置为 1 
    b.set()           //把 b 中所有二进制位都置为 1
    b.set(pos)        //把 b 中在 pos 处的二进制位置为 1 
    b.reset()         //把 b 中所有二进制位都置为 0 
    b.reset(pos)      //把 b 中在 pos 处的二进制位置为 0 
    b.flip()          //把 b 中所有二进制位逐位取反 
    b.flip(pos)       //把 b 中在 pos 处的二进制位取反 
    b.to_ulong()      //用 b 中同样的二进制位返回一个 unsigned long 值 
    os << b           //把 b 中的位集输出到 os 流
    

    bitset类变量可以正常进行位运算(如&,|,~,<<,>>

    简单实例

    实现2进制向10进制的转换,而且二进制的表示形式是一种逆序的形式,即低位在前。

    int bin2dec(const string& bin)
    {
        std::bitset<8> bs(string(bin.rbegin(), bin.rend()));
        return bs.to_ulong();
    }
    

  • 相关阅读:
    C#高级编程第11版
    做点字符串题
    Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020
    Educational Codeforces Round 97 题解
    AtCoder Regular Contest 106 题解
    Kick Start Round G 2020 题解
    CCSP 2020题解
    Codeforces Round #675 (Div. 2) 题解
    AtCoder Regular Contest 104
    Kick Start Round F 2020 题解
  • 原文地址:https://www.cnblogs.com/widerg/p/7649321.html
Copyright © 2011-2022 走看看