「C/C++」C++11 之 std::bitset 二进制数据处理模板库

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • std::bitset:C++中的位操作利器(支持C++11及以上版本)
        • 一、`std::bitset`简介与支持版本
        • 二、`std::bitset`的基本特性
        • 三、`std::bitset`的构造与初始化
        • 四、`std::bitset`的常用操作
        • 五、`std::bitset`的应用场景
        • 六、总结

std::bitset:C++中的位操作利器(支持C++11及以上版本)

在C++编程中,处理二进制数据是一个常见且重要的任务。为了简化这一任务,C++11标准引入了std::bitset类模板,它允许程序员以固定大小的位集合形式来存储和操作二进制数据。本文将详细介绍std::bitset的用法,包括其支持的C++版本、基本特性、常用操作以及代码示例。

在这里插入图片描述

一、std::bitset简介与支持版本

std::bitset是C++标准库中的一个模板类,定义在<bitset>头文件中。它根据模板参数指定的位数来创建一个位集合,这个固定长度在创建对象时指定,并且不能在运行时更改。std::bitset提供了丰富的成员函数来访问和修改位集合中的位,以及进行位运算和集合运算。需要注意的是,std::bitset是在C++11标准中引入的,因此它支持C++11及更高版本的编译器。

二、std::bitset的基本特性
  1. 固定长度std::bitset的长度在编译时确定,不能动态改变,这有助于防止溢出和错误。
  2. 类型安全:与直接使用整数进行位操作相比,std::bitset提供了类型安全的位操作,减少了出错的可能性。
  3. 易读性std::bitset提供了将位集合转换为二进制字符串的功能,使得输出和调试更加直观。
  4. 丰富的成员函数std::bitset提供了丰富的成员函数来访问、修改和操作位集合,使得编程更加便捷。
三、std::bitset的构造与初始化

std::bitset可以通过多种方式构造和初始化,包括无参构造、使用二进制整数初始化、使用二进制字符串初始化以及使用另一个std::bitset对象初始化。

代码示例

#include <iostream>
#include <bitset>

int main() {
    // 无参构造,所有位初始化为0
    std::bitset<8> b1;
    std::cout << "b1: " << b1 << std::endl; // 输出:b1: 00000000

    // 使用二进制整数初始化(注意:这里使用的是十进制字面量,但二进制表示是0b10101010)
    std::bitset<8> b2(170); // 170的二进制表示是10101010
    std::cout << "b2: " << b2 << std::endl; // 输出:b2: 10101010

    // 使用二进制字符串初始化(注意:字符串中的字符只能是'0'或'1')
    std::bitset<8> b3("1100"); // 字符串长度不足,高位补0
    std::cout << "b3: " << b3 << std::endl; // 输出:b3: 00001100

    // 使用另一个std::bitset对象初始化
    std::bitset<8> b4(b2);
    std::cout << "b4: " << b4 << std::endl; // 输出:b4: 10101010

    return 0;
}

PS:以下在for循环遍历的时候是从右边开始为下标0

#include <iostream>
#include <bitset>

int main() {
	std::bitset<8> b5 = 0b10101010;
	std::cout << "b5: " << b5 << std::endl; // 输出:b5: 10101010
	for(int i = 0; i < b5.size(); i++)// Ps:这是从右边开始为下标0
	{
		std::cout << b5[i] << std::endl;// 输出:b5: 01010101 
	}

    return 0;
}
四、std::bitset的常用操作

std::bitset提供了丰富的成员函数来访问和修改位集合中的位,以及进行位运算和集合运算。

代码示例

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b1(170); // 170的二进制表示是10101010

    // 访问位
    bool bit0 = b1[0]; // 访问第0位,返回false(0)
    bool bit4 = b1[4]; // 访问第4位,返回true(1)
    std::cout << "bit0: " << bit0 << ", bit4: " << bit4 << std::endl;

    // 修改位
    b1.set(1); // 将第1位设置为1
    b1.reset(4); // 将第4位重置为0
    std::cout << "After set(1) and reset(4): " << b1 << std::endl;

    // 取反位
    b1.flip(0); // 将第0位取反
    std::cout << "After flip(0): " << b1 << std::endl;

    // 位运算
    std::bitset<8> b2(85); // 85的二进制表示是01010101
    std::bitset<8> b3 = b1 & b2; // 按位与
    std::bitset<8> b4 = b1 | b2; // 按位或
    std::bitset<8> b5 = b1 ^ b2; // 按位异或
    std::bitset<8> b6 = ~b1; // 按位取反
    std::cout << "b3 (AND): " << b3 << std::endl;
    std::cout << "b4 (OR): " << b4 << std::endl;
    std::cout << "b5 (XOR): " << b5 << std::endl;
    std::cout << "b6 (NOT): " << b6 << std::endl;

    // 转换为无符号整数
    unsigned long num = b1.to_ulong();
    std::cout << "b1 to unsigned long: " << num << std::endl;

    // 统计置位(值为1)的位数
    std::size_t count = b1.count();
    std::cout << "Number of set bits in b1: " << count << std::endl;

    return 0;
}
五、std::bitset的应用场景
  1. 状态存储:使用std::bitset来存储程序的状态信息,如开关状态、标志位等。
  2. 权限控制:使用std::bitset来表示用户的权限信息,通过位运算来检查或修改权限。
  3. 位运算操作:在需要进行位运算的场景中,使用std::bitset可以简化代码并提高可读性。
  4. 数据压缩:在需要存储大量二进制数据的场景中,使用std::bitset可以节省存储空间并提高数据访问效率。
六、总结

std::bitset是C++11及更高版本中引入的一个非常有用的类模板,它提供了一种方便的方式来处理二进制数据,并提供了丰富的成员函数来访问和修改位集合中的位。通过合理使用std::bitset,程序员可以简化代码、提高可读性并优化性能。无论是在状态存储、权限控制还是位运算操作中,std::bitset都是一个不可或缺的工具。希望本文能够帮助读者更好地理解和使用std::bitset


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫-爬取蛋白晶体和分子结构

文章目录 前言一、环境准备二、爬取PDB蛋白结构1.下载指定数量的随机PDB2.下载指定靶标的PDB二、从ZINC爬取小分子mol2结构1.下载指定数量的随机分子2.下载指定分子三、从ChEMBL爬取小分子信息1.下载指定ID的SMILES(测试不成功,网站变成readonly了)四、总结爬虫1.查看对应的…

【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例

上篇文章&#xff1a;Vue】Vue&#xff08;九&#xff09;OptionsAPI与CompositionAPI的区别 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月15日11点13分 文章目录 toRefs()和toRe…

生成模型初认识

生成模型初认识 参考学习资料&#xff1a;李宏毅-机器学习 以下为课程过程中的简易笔记 生成模型 为什么要用生成模型&#xff1f;——创造力&#xff1a;同一个输入&#xff0c;产生不同的输出&#xff08;distribution&#xff09;&#xff0c;有一定概率发生某种随机事件…

2024 OSCAR|《开源体系建设路径模式洞察与建议》即将发布

近年来&#xff0c;开源体系建设受到高度重视&#xff0c;国家软件发展战略和“十四五”规划纲要均对开源作出重要部署&#xff0c;为我国开源体系建设和发展指明了方向。9月25日&#xff0c;工业和信息化部党组书记、部长金壮指出要加强开源体系建设&#xff0c;助推产业高质量…

大语言模型(LLM)入门级选手初学教程

链接&#xff1a;https://llmbook-zh.github.io/ 前言&#xff1a; GPT发展&#xff1a;GPT-1 2018 -->GPT-2&GPT-3&#xff08;扩大预训练数据和模型参数规模&#xff09;–> GPT-3.5&#xff08;代码训练、人类对齐、工具使用等&#xff09;–> 2022.11 ChatG…

c++初阶--string类(使用)

大家好&#xff0c;许久不见&#xff0c;今天我们来学习c中的string类&#xff0c;在这一部分&#xff0c;我们首先应该学习一下string类的用法&#xff0c;然后再试着自己去实现一下string类。 在这里&#xff0c;我使用的是这个网站来查找的string类&#xff0c;这里面的内容…

mysql--基本查询

目录 搞定mysql--CURD操作&#xff0c;细节比较多&#xff0c;不难&#xff0c;贵在多多练 1、Create--创建 &#xff08;1&#xff09;单行插入 / 全列插入 &#xff08;2&#xff09;插入否则替换 &#xff08;3&#xff09;替换 2、Retuieve--select 1&#xff09;全…

Android系統Audio hal

一.Android系統Audio hal简介 Android系统的音频硬件抽象层(HAL)是系统与硬件之间的桥梁,允许音频应用和服务访问底层音频硬件,而无需直接与硬件交互。 主要组件: 音频 HAL 接口:定义了应用和服务如何调用音频硬件的规范。典型的音频操作包括播放、录制、音量控制等。 …

day5:权限管理

一&#xff0c;权限概述 什么是权限 合适的人干合适的事情 权限的作用 根据用户的等级&#xff0c;分配对应的权利&#xff0c;完成不同用户对不同资源的相关操作。 权限的分类 r&#xff08;4&#xff09;读w&#xff08;2&#xff09;写x&#xff08;1&#xff09;执行 …

深入理解Agent:从0实现function call

Function的调用时Agent实现很重要的一步&#xff0c;只有 理解了function call这个原理才可以更好的创建Agent。 我将不使用任何langchain等框架或者coze等平台&#xff0c;从0开始构建一个可以调用function的Agent。 源代码已经上传github&#xff1a;https://github.com/as…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋&#xff0c;凭借其强大的技术实力和深厚的行业经验&#xff0c;推出了成熟的云服务解决方案&#xff0c;为轻量化视频制作开辟了全新的道路。 一、成熟方案&#xff0c;接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

(六) 进程控制

(六) 进程控制 ps(1) 命令可以帮助我们分析本章中的一些示例&#xff0c;所以简单介绍一些参数的组合方式&#xff0c;更详细的信息请查阅 man 手册。 ps axf 主要用于查看当前系统中进程的 PID 以及执行终端(tty)和状态等信息&#xff0c;更重要的是它能显示出进程的父子关系…

WSL2 构建Ubuntu系统-轻量级AI运行环境

环境&#xff1a;Win11 软件&#xff1a;WSL2 安装环境&#xff1a;Ubuntu 22.04 检查电脑是否开启虚拟化 打开&#xff1a;任务管理器->性能->CPU CPU 开启虚拟化&#xff08;通常默认是开启的&#xff0c;如果没有开启需要BIOS开启&#xff09; 虚拟化设置&#xff0…

uni-app 扫码插件推荐:基于支付宝 mPaaS 扫码组件开发,支持 Android 和 iOS

一. 前言 之前说到&#xff0c;我的一个 uni-app 项目遭到用户吐槽&#xff1a;“你们这个 App 扫码的正确率太低了&#xff0c;尤其是安卓的设备。经常性的扫码扫不出来&#xff0c;就算是扫出来了&#xff0c;也是错误的结果&#xff01;” 面对以上这个问题&#xff0c;我…

Vert.x,认证与授权 - HTTP基本认证

几乎所有的线上系统都离不开认证和授权&#xff0c;Vert.x auth相关组件提供了丰富(Session&#xff0c;JTW, OAuth&#xff0c;…)&#xff0c;便捷的认证和授权支持。 当前&#xff0c;使用最多是Web应用&#xff0c;所以在后续讨论中&#xff0c;都是关于Vert.x auth在Web应…

【大数据分析与挖掘模型】matlab实现——非线性回归预测模型

一、实验目的 掌握有关非线性回归的理论知识&#xff0c;通过变量代换把本来应该用非线性回归处理的问题近似转化为线性回归问题&#xff0c;并进行分析预测。 二、实验任务 对非线性回归实例进行编码计算&#xff0c;实例如下&#xff1a; 三、实验过程 1.运行非线性回归中…

【TFR-Net】基于transformer重建网络

abstract&#xff1a; 提高对数据缺失的鲁棒性已经成为多模态情感分析&#xff08;MSA&#xff09;的核心挑战之一&#xff0c;MSA旨在从语言、视觉和声学信号中判断说话者的情感。在目前的研究中&#xff0c;针对不完全模态特征的MSA&#xff0c;提出了基于平移的方法和张量正…

Unity-Editor扩展,引擎管理AudioClip,音乐音效快捷播放功能

目录 选择一个Audio 音频文件即会 关键在于三个快捷模式 播放&#xff0c; 自动播放 循环播放 根本不需要Editor扩展开发 没找到虚幻引擎的audio 的管理是怎么样的 参考&#xff1a; 本来&#xff0c;觉得没有快捷方式&#xff0c;播放很不爽 想自定义搞一个&#xff…

全面了解 NGINX 的负载均衡算法

NGINX 提供多种负载均衡方法&#xff0c;以应对不同的流量分发需求。常用的算法包括&#xff1a;最少连接、最短时间、通用哈希、随机算法和 IP 哈希。这些负载均衡算法都通过独立指令来定义&#xff0c;每种算法都有其独特的应用场景。 以下负载均衡方法&#xff08;IP 哈希除…

aws 把vpc残留删除干净

最近忘了把vpc 删干净导致又被收了冤大头钱 在删除vpc 的收发现又eni在使用&#xff0c;但是忘了是哪个资源在占用 先用命令行把占用的资源找出来停掉 使用 AWS 命令行界面&#xff08;CLI&#xff09;来查看 VPC 的使用情况 列出子网&#xff1a; aws ec2 describe-subnets …