C++基础——简单而强大的bitset

2023-11-18

一些简单的原子操作,往往能组合出复杂而强大的功能。位操作的深远意义不在于表示一种数值,而是可能的情况数。我虽然暂时不知道bitset能组合出如何复杂的功能,但冥冥之中却有这样的直觉感受。


basis

#include <bitset>
std::bitset<8> bs;      

// 模板参数是一个size_t类型的数值(value),而非一个类型
// numeric_limits<size_t>::min() == 0
// std::bitset<8> 表示的二进制位为8位,
// 默认的构造函数将其初始为全0

cout << bs.to_ulong() << endl;      // 0
cout << bs.to_string() << endl;     // 00000000

bitset 的构造

唯一需要注意的是,bitset<>模板类虽然重载了中括号运算符,bs[0]表示的是将该数值转换为二进制时的最末尾元素,而非首位(其意义和数组并不相同)。

std::bitset<8> bs;
//bs[0] = 1;            // 0000 0001
//bs[7] = 1;            // 1000 0000
  • 默认无参构造
    初始化全部位为0

-十进制或者16进制数值

std::bitset<8> bs(7);
bs.to_string()  // 0000 0111
std::bitset<8> bs(0x07);
bs.to_string()  // 0000 0111

这里也存在一些高大上的构造方式:

bitset<numeric_limits<unsigned short>::digits> bs1(267);
    // 16位 
bitset<numeric_limits<unsigned long>::digits> bs2(267);
    // 32位
  • 用string对象
std::bitset<8> bs("00000111");
bs.to_ulong();      // 7

bitset的操作

成员函数 函数功能
bs.any() 是否存在值为1的二进制位
bs.none() 是否不存在值为1的二进制位
或者说是否全部位为0
bs.size() 位长,也即是非模板参数值
bs.count() 值为1的个数
bs.test(pos) 测试pos处的二进制位是否为1
与0做或运算
bs.set() 全部位置1
bs.set(pos) pos位处的二进制位置1
与1做或运算
bs.reset() 全部位置0
bs.reset(pos) pos位处的二进制位置0
与0做或运算
bs.flip() 全部位逐位取反
bs.flip(pos) pos处的二进制位取反
bs.to_ulong() 将二进制转换为unsigned long输出
bs.to_string() 将二进制转换为字符串输出
~bs 按位取反
效果等效为bs.flip()
os << b 将二进制位输出到os流
小值在右,大值在左

一些高级用法

首先看一个简单实例:

"1000 0000" - > 1
"1000 1000" - > 17

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

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

这里回顾开头引用中的话,bitset的强大之处不在于表示一个二进制的数值,而是表达一种情况数,一个二进制位可以表示两种情况,两个二进制位可以表示4种状况数,3个二进制位可以表达8种状况数,等等。

将Bitsets视为一组标志

enum Color{red, yellow, green, blue, white, black, numColors};
// 初始状态下,全部颜色都未使用
bitset<numColors> usedColors;

// something happens
usedColors.set(red);
usedColors.set(blue);

cout << "bitfield of used colors: " << usedColors << endl;
cout << "bitfield of unused colors: " << ~usedColors << endl;

// process if any color is used 
if (usedColors.any())
{
    for (int c = 0; c < numColors; ++c)
    {   // 貌似只有遍历,而没有提供返回值为1的下标
        if (usedColor[Color(c)])
        {
            // 
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础——简单而强大的bitset 的相关文章

随机推荐

  • Ubuntu 安装与使用 Visual Studio Code

    1 Visual Studio Code简介 1 1 什么是Visual Studio Code Visual Studio Code是微软推出的一个运行于 Mac OS X Windows和 Linux 之上的 针对于编写现代 Web 和
  • 服务计算:简单的web程序

    CloudGo 框架选择 看了go的一些框架如beego和iris觉得挺好的 本来想用 但是虚拟机出了点问题装不成 windows上装成了没ab指令 所以使用官方的net http库做简单的实验 看完beego和iris的特性我还是比较想用
  • Linux下yum安装dstat,安装配置整理之 dstat

    tech163 usr local download dstat help Usage dstat afv options delay count Versatile tool for generating system resource
  • 菜鸡面试遇到有印象的问题(LINUX下内核如何管理内存)

    目录 写在文章的前面 本人C C 面试岗位 学艺不精 研究生做的与代码无关的工作 仅记录每次面试遇到的问题勉励自己 一 x86下的物理地址空间布局 二 linux虚拟地址内核空间分布 三 linux虚拟地址用户空间分布 1 page 页 2
  • 通过tableExport.js插件导出jqgrid表格数据

    通过tableExport js插件导出jqgrid表格数据 提前说 没有实现导出pdf png和ppt 实现了导出 JSON XML CSV TXT SQL MS Word Ms Excel 代码实例 包含改进的tableExport j
  • MySQL建表设置默认值取值范围

    一 设置默认值 设置默认值采用default 如代码所示 二 设置取值范围 设置取值范围采用check 如代码所示 create table student id int not null primary key auto incremen
  • java项目自动化单元测试

    对于我们开发人员来说 单元测试一定不会陌生 但在各种原因下会被忽视 尤其是在我接触到的项目中 提测阶段发现各种各样的问题 我觉得有必要聊一下单元测试 为了写而写的单元测试没什么价值 但一个好的单元测试带来的收益是非常客观的 问题是怎么去写好
  • CVAT标注工具的部署步骤详解

    简介 CVAT Computer Vision Annotation Tool 此标注工具是用于机器视觉数据标注的在线标注工具 以网页形式标注 能够生成多种数据标注格式基本涵盖了市面上百分之九十以上格式 此工具也有自己的标注格式 此工具的优
  • Canvas 详解

    HTML 5 Canvas 参考手册
  • ES6语法知识点

    目录 let const 常用 暂时性死区 const 建议 箭头函数 常用 建议 iterator迭代器 解构赋值 常用 建议 剩余 扩展运算符 常用 扩展运算符 剩余运算符 在对象中使用扩展运算符 建议 对象属性 方法简写 常用 对象属
  • centos7 搭建Hadoop3.0.3完全分布式

    第一步 服务器规划 IP地址 主机名称 nameNode dataNode 192 168 60 201 master 是 否 192 168 60 200 node1 否 是 第二步 基于依赖环境准备 1 centos7 搭建JDK8 参
  • Java后台面试题

    Java后台面试题 一 Java内存 私有内存区 伴随线程的产生而产生 一旦线程终止 私有内存区也会自动消除 程序计数器 指示当前程序执行到了哪一行 执行Java方法时记录正在执行的虚拟机字节码指令地址 执行本地方法时 计数器值为null
  • Linq语法详细

    1 简单的linq语法 1 var ss from r in db Am recProScheme select r 2 var ss1 db Am recProScheme 3 string sssql select from Am re
  • 不加电透明屏:在场景化应用中,有哪些特点和优点?

    不加电透明屏是一种新型的显示技术 它可以在不需要电源的情况下显示图像和文字 这种屏幕的原理是利用光的折射和反射来实现显示效果 而不需要通过电流来激发像素点 不加电透明屏的最大优点是节能环保 传统的显示屏需要消耗大量的电能来显示图像 而不加电
  • 环境搭建04-Ubuntu16.04更改conda,pip的镜像源

    我常用的pipy国内镜像源 https pypi tuna tsinghua edu cn simple 清华 http mirrors aliyun com pypi simple 阿里云 https pypi mirrors ustc
  • Java-基于SSM的药品销售管理系统

    项目背景 本论文主要论述了如何使用JAVA语言开发一个药品销售系统 本系统将严格按照软件开发流程进行各个阶段的工作 采用B S架构 面向对象编程思想进行项目开发 在引言中 作者将论述药品销售系统的当前背景以及系统开发的目的 后续章节将严格按
  • 【论文翻译】基于层次结构的动态异构图嵌入

    基于层次结构的动态异构图嵌入 Dynamic Heterogeneous Graph Embedding Using Hierarchical Attentions 百度学术 摘要 图嵌入已经引起了许多研究兴趣 现有的研究主要集中在静态同质
  • 2018.08.31 WorkSummary——05

    最近在做一个SMH spring springmvc hibernate 的项目 比较有意思 主要是在前端做大数据展示 后台业务较少 但是表特别多 一个图对应一个表 一共上百个图 hibernate是特点是操作对象等于操作数据库 每个表对应
  • React Native

    小手动一动 点赞转发加关注 微信搜索 大前端杂货铺 公众号关注大前端老司机带您遨游大前端知识的海洋 关注 Github https github com big frontend 还有大前端代码实践哦 java 与 javascript 互
  • C++基础——简单而强大的bitset

    basis bitset 的构造 bitset的操作 一些高级用法 将Bitsets视为一组标志 一些简单的原子操作 往往能组合出复杂而强大的功能 位操作的深远意义不在于表示一种数值 而是可能的情况数 我虽然暂时不知道bitset能组合出如