bitset的定义和初始化

详解C++中的bitset用法 bitset是C++标准库中用于处理固定大小二进制位序列的高效工具。它具有内存占用小(N位仅需约(N+7)/8字节)、操作高效(直接映射CPU指令)和接口丰富(支持位设置、测试、运算等)三大优势。使用时需在编译时确定大小,支持从数值或字符串初始化,提供安全的边界检查方法。典型应用包括状态标志、位图、筛法和布隆过滤器等。其局限性在于大小固定,不适合动态场景。总体而言,bitset是处理密集布尔数据的理想选择。 阅读详情

 bitset的定义和初始化

表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:

bitset<32> bitvec; //32位,全为0。

给出的长度值必须是常量表达式(2.7节)。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。

这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。


bitset<n> b; 
b有n位,每位都为0

bitset<n> b(u); 
b是unsigned long型u的一个副本

bitset<n> b(s); 
b是string对象s中含有的位串的副本

bitset<n> b(s, pos, n); 
b是s中从位置pos开始的n个位的副本


1. 用unsigned值初始化bitset对象

当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。

在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象:

// bitvec1 is smaller than the initializer

bitset<16> bitvec1(0xffff);          // bits 0 ... 15 are set to 1

// bitvec2 same size as initializer

bitset<32> bitvec2(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0

// on a 32-bit machine, bits 0 to 31 initialized from 0xffff

bitset<128> bitvec3(0xffff);         // bits 32 through 127 initialized to zero

上面的三个例子中,0到15位都置为1。由于bitvec1位数少于unsigned long的位数,因此bitvec1的初始值的高阶位被丢弃。bitvec2和unsigned long长度相同,因此所有位正好放置了初始值。bitvec3长度大于32,31位以上的高阶位就被置为0。

2. 用string对象初始化bitset对象

当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左:

string strval("1100");

bitset<32> bitvec4(strval);

bitvec4的位模式中第2和3的位置为1,其余位置都为0。如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0。


string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。

不一定要把整个string对象都作为bitset对象的初始值。相反,可以只用某个子串作为初始值:

string str("1111111000000011001101");

bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

bitset<32> bitvec6(str, str.size() - 4);     // use last 4 characters

这里用str中从str[5]开始包含四个字符的子串来初始化bitvec5。照常,初始化bitset对象时总是从子串最右边结尾字符开始的,bitvec5的从0到3的二进制位置为1100,其他二进制位都置为0。如果省略第三个参数则意味着取从开始位置一直到string末尾的所有字符。本例中,取出str末尾的四位来对bitvec6的低四位进行初始化。bitvec6其余的位初始化为0。这些初始化过程的图示如下:

 

多种bitset操作(表3-7)用来测试或设置bitset对象中的单个或多个二进制位:

表3-7  bitset操作
b.any() 
b中是否存在置为1的二进制位?

b.none() 
b中不存在置为1的二进制位吗?

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流


1. 测试整个bitset对象

如果bitset对象中有一个或多个二进制位置为1,则any操作返回true,也就是说,其返回值等于1;相反,如果bitset对象中的二进制位全为0,则none操作返回true。

bitset<32> bitvec; // 32 bits, all zero

bool is_set = bitvec.any();            // false, all bits are zero

bool is_not_set = bitvec.none();      // true, all bits are zero

如果需要知道置为1的二进制位的个数,可以使用count操作,该操作返回置为1的二进制位的个数:

size_t bits_set = bitvec.count(); // returns number of bits that are on

count操作的返回类型是标准库中命名为size_t的类型。size_t类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本。它是一个与机器相关的unsigned类型,大小可以保证存储内存中对象。

与vector和string中的size操作一样,bitset的size操作返回bitset对象中二进制位的个数,返回值的类型是size_t:

size_t sz = bitvec.size(); // returns 32

2. 访问bitset对象中的位

可以用下标操作符来读或写某个索引位置的二进制位,同样地,也可以用下标操作符测试给定二进制位的值或设置某个二进制位的值:

// assign 1 to even numbered bits

for (int index = 0; index != 32; index += 2)

           bitvec[index] = 1;

上面的循环把bitvec中的偶数下标的位都置为1。

除了用下标操作符,还可以用set、test和reset操作来测试或设置给定二进制位的值:

// equivalent loop using set operation

for (int index = 0; index != 32; index += 2)

           bitvec.set(index);

为了测试某个二进制位是否为1,可以用test操作或者测试下标操作符的返回值:

if (bitvec.test(i))

    // bitvec[i] is on

// equivalent test using subscript

if (bitvec[i])

    // bitvec[i] is on

如果下标操作符测试的二进制位为1,则返回的测试值的结果为true,否则返回false。

3. 对整个bitset对象进行设置

set和reset操作分别用来对整个bitset对象的所有二进制位全置1和全置0:

bitvec.reset();    // set all the bits to 0.

bitvec.set();      // set all the bits to 1

flip操作可以对bitset对象的所有位或个别位按位取反:

bitvec.flip(0);   // reverses value of first bit

bitvec[0].flip(); // also reverses the first bit

bitvec.flip();    // reverses value of all bits

4. 获取bitset对象的值

to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作:

unsigned long ulong = bitvec3.to_ulong();

cout << "ulong = " << ulong << endl;

to_ulong操作主要用于把bitset对象转到C风格或标准C++之前风格的程序上。如果bitset对象包含的二进制位数超过unsigned long的长度,将会产生运行时异常。本书将在6.13节介绍异常(exception),并在17.1节中详细地讨论它。

5. 输出二进制位

可以用输出操作符输出bitset对象中的位模式:

bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0

cout << "bitvec2: " << bitvec2 << endl;

输出结果为:

bitvec2: 00000000000000001111111111111111

6. 使用位操作符

bitset类也支持内置的位操作符。C++定义的这些操作符都只适用于整型操作数,它们所提供的操作类似于本节所介绍的bitset操作。5.3节将介绍这些操作符。

bitset的用法 阅读详情

相关推荐

【算法竞赛学习笔记】Bitset详解和应用

title : bitset date : 2021-8-20 tags : ACM,数据结构 author : Linno Bitset bitset是一种类似数组的数据结构,它的每一个元素只能是0或1,每个元素只用1bit的空间。可以使用只包含‘0’或‘1’的字符串构造。 优点 支持所有的位运算。 空间占用非常小,也可用于优化时间。 声明方式 #include<bitset> bitset<30>bi; string s="100101"; bitset<10>.

SC_Linno的博客 2702

C++——bitset

bitset——简单又方便的位运算工具

JAN6055的博客 1万+

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 588

C++基础之bitset

类模板std::bitset template <size_t N> class bitset; 头文件 #include <bitset> 说明 一个bitset中保存了一些bit(字节, 只能取两个值的元素:0或1,真或假 …) bitset模拟了一个bool类型的数组,但是优化了内存空间:总的来说,每个元素值占用一个bit(比大多数系统中最小的元素char小了8倍) 每个位置的都可以独立的访问:例如,给定一个bitset命名为foo,foo[3]访问的就是第四个元素,就像通常数

itlilyer的博客 4499

XILINX偶然加载不成功的问题原因及解决方法

本文为明德扬原创文章,转载请注明出处! 一、项目背景 明德扬(MDY)在2021年承担了多个基于XILINX芯片的研发项目,包括VPX网络透明传输项目(芯片为XC7K325T-2FBG900)、某高端测试仪项目(芯片为XCKU060-FFVA1156)、某网闸设备项目(芯片为XC7Z030-FBG676)等,另外,明德扬自研了基于XC7K325T-2FBG900和基于XC7K410T-2FBG900芯片的核心板,在XILINX研发领域拥有丰富的经验。即使拥有丰富经验和积累,每个新项目我们均...

6036

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4187

C++中的bitset类型

C++中的bitset类型 声明:本文转载于白痴天才梦的博客,为了今后他人和自己学习。 C++中的bitset类型C++中的bitset类型1、认识标准库bitset类型2、bitset对象的定义3、bitset对象的初始化3.1用unsigned值初始化3.2用string对象初始化bitset对象4、访问bitset对象中的位 1、认识标准库bitset类型 位是用来保存一组项或者条件的yes/no(1或者0)信息的一种简洁方法,那么位集就是二进制位的有序集。 C++中标准库提供的bitset类在我们程

weixin_44380570的博客 350

Label Studio 图像分割自动标注接入教程:从模型预测到一键上传 Predictions

这篇文章详细介绍了如何使用Label Studio进行图像分割任务的自动标注流程。主要内容包括: 环境准备:安装Label Studio和模型推理依赖 项目配置:启动Label Studio服务,创建项目并配置BrushLabels标注界面 数据准备:导入待标注图片,获取API访问凭证 模型推理:运行训练好的分割模型生成预测mask 结果上传:将预测结果转换为Label Studio格式并通过API上传为Predictions 文章提供了完整的操作指南,包括: 详细的命令行参数说明 推荐的项目目录结构 标注

. 451

Bitset 的用法

转自:http://www.cnblogs.com/bless/articles/1264549.html 3.5.1  bitset的定义和初始化 表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度

chenhq1991的专栏 1034

【Unity实战】实现最完美最简单的UI适配方案,背景压缩或者拉伸变形解决方案,手机刘海屏适配,适配不同分辨率,不同尺寸,不同设备。

这期来讲一个简单的UI设计方案,很多同学可能搞不懂锚点、轴心这些概念,导致做好的UI在别人的设备上,乱跑或者是重叠,或者是参加游戏老发时间比较紧来不及做适配,都可以来试试这个方法,通过填充边框来保持游戏画面的原始比例,所以它的缺点也很明显,在一些移动设备上会浪费比较大的显示面积。 unity不同设备UI变形? UI在不同设备上如何适配?

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3648

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1548

C++ bitset

C++中不允许使用变量作为数组的长度定义数组,必须为常量值,c++中所有的内存需求都是在程序执行前通过定义的常量来确定的。(另外bitset变量实际上是按照字节数存储,如。这样要求是因为编译器在。

weixin_45906246的博客 869

基于STM32单片机设计的智能水温控制系统

本项目研究并实现了一种基于STM32单片机的智能水温控制系统。系统以STM32F103RCT6作为主控制器,通过DS18B20温度传感器实时采集水温数据,利用PID控制算法精确调节5V直流防水型70W加热棒的功率输出,确保水温恒定在设定范围内。此外,采用OLED显示屏显示当前水温和预设上限阀值,并集成ESP8266-WiFi模块与自研Android手机APP进行远程通信和控制。用户可通过本地按键或手机APP设置温度阀值,实现实时监控与智能化管理。整个系统设计旨在提高水资源利用效率,提升生活及工业用水环境的舒

8790

bitset用法

bitset用法 介绍 bitset大概就是类似于bool数组一样的东西. 但是它的每个位置只占1bit(特别特别小) bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹)一般来说bitset会让你的算法复杂度 /32(具体是什么要看计算机) 定义与初始化 使用bitset类型需#include bitset类型在定义时就需要指定所占的空间,例如 bitset<233>bit; bitset类型可以用string和整数初始化(整数转化成对应的二进制) #include&

LXYDSF的博客 1110

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++STL中bitset的介绍与使用

是C++标准模板库(STL)中的一个模板类,用于表示和操作固定大小的二进制序列(即一组位)。以下是的详细介绍和使用方式。是一个模板类,其模板参数定义了位集合的大小。例如,bitset<32>表示一个包含32位的位集合。默认构造函数:创建一个长度为N的位集合,所有位都被设置为0。return 0;使用整数初始化:位集合的每一位将被对应的整数的二进制表示所设置。使用字符串初始化:字符串中的字符必须是’0’或’1’。

2301_80215285的博客 1564

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++ bitset 详解

有些程序需要处理二进制位的有序集,每个位可能包含0(关)或1(开)值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供的bitset类简化了位集的处理。声明:#include <bitset> using namespace std::bitset;bitset对象的定义和初始化bitset<n> b; b有n位,每位都为0 bitset<n>

永远不要给自己找借口 3239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[C++] bitset

bitset #include<bitset> bitset 对象的定义和初始化 定义bitset时,要明确bitset有多少位: bitset<32> bitvec //32位二进制,初始化为0 对于负数,在存储是会以负数的补码形式存储。 bitset<10> haha(-20); 用unsigned 值初始化bitset 对象: 当用unsig...

176

STL中便捷的bitset

有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件。在本书提供的例子中,假设都使用了std::bitset的using声明:

浮白 4305

bitset简介

本文转自:http://blog.youkuaiyun.com/bill_ming/article/details/7180445 bitset的定义和初始化 表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括

聚沙成塔 积水成渊 655

C++标准库(八):bitset 类型

本文为《C++ Primer》的读书笔记 目录定义和初始化`bitset`默认初始化使用`unsigned long long` 初始化从一个`string` / 字符数组 初始化`bitset``bitset`操作 #include <bitset> 标准库定义了bitset类, 使得位运算的使用更为容易, 并且能够处理超过最长整型类型大小的位集合 定义和初始化bitset 可以通过位置来访问bitset中的二进制位。例如,bitvec包含编号从0到31的32个二进制位。编号从0开始的二进

连理o的博客 2450

bitset类型

3.5.1  bitset的定义和初始化  表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值: bitset32> bitvec; //32位,全为0。   给出的长度值必须是常量表达式(2.7节)。

1383

3.6 标准库 bitset 类型

3.5.1 bitset对象的定义和初始化 类似于vector,bitset类是一种类模板;而于vector不一样的是bitset类型对象的区别仅在其长度而不是其类型。在定义bitset时,需明确bitset含有多少位,需在尖括号内给出它的长度值: bitset<32>bitvec; 给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整型的const对象。 这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样

m0_59968203的博客 302

bitset 用法

出处:点击打开链接 bitset 类简化了位集的处理,有些程序要使用二进制位的有序集来保存一组项或条件的标志位,可以考虑使用bitset。 需要的文件: #include Using std::bitset l         bitset 对象的定义和初始化 定义bitset时,要明确bitset有多少位: bitset

To be what you what to be! 2587

c++ bitset类用法

转自:https://blog.youkuaiyun.com/vocaloid01/article/details/82798450 有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件。在本书提供的例子中,假设...

Kuguotao的博客 393

标准库——bitset类型

关于标准库中sring、vector、set、map、queue、stack 、bitset等,方法有些记不清楚,每次用每次查,很费时间,干脆自己整理一下,记不住的时候,查询更方便。 // 需要包含头文件和声明: #include<bitset> using std::bitset; bitset对象的定义和初始化 bitset类型对象的区别仅在其长度,而不在其类型。定义时,&...

优快云的博客 522
上一篇: C++中竟然可以用 ... 这样省略形参
下一篇: 不要指望着爱情能救赎你的未来
i丹明扬
博客等级 码龄15年 331粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值