学习

简单而强大的bitset

Wider · 1月27日 · 2020年 · · 5300次已读

简单而强大的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();
}

0 条回应