位段——(详细图解,保姆宗师级教程,包会,从基础概念到精通实战应用)

本文主要是介绍位段——(详细图解,保姆宗师级教程,包会,从基础概念到精通实战应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

位段——大项目中结构体节省空间之手段

学习目标:

位段是什么
位段的内存分配
位段的平台局限性和应用

学习内容:

1.位段是什么

C++中的位段(Bit fields)是一种用于有效利用内存的特性,可以在结构体中定义成员变量的位数。它允许我们将多个成员变量打包到同一个内存单元中,从而节省内存空间。
在这里插入图片描述

通过位段,我们可以指定结构体成员变量的位数,以及它们在内存中的存储顺序。比如,假设我们想要定义一个结构体来表示一个日期,其中包括年、月、日。在不使用位段的情况下,每个成员变量通常都会占用一个整型(比如int)的大小,即4个字节。但是如果我们知道年份的范围在0到99之间,月份在1到12之间,日期在1到31之间,那么我们可以使用位段来减小结构体的大小。

struct Date {unsigned int year : 7;   // 使用7位存储年份(0-99)unsigned int month : 4;  // 使用4位存储月份(1-12)unsigned int day : 5;    // 使用5位存储日期(1-31)
};int main() {Date d;d.year = 21;   // 存储的二进制为 010101,对应十进制为 21d.month = 10;  // 存储的二进制为 1010,对应十进制为 10d.day = 18;    // 存储的二进制为 10010,对应十进制为 18// 输出结果std::cout << "Year: " << d.year << std::endl;std::cout << "Month: " << d.month << std::endl;std::cout << "Day: " << d.day << std::endl;std::cout<<sizeof(Data)<<std::endl;return 0;
}

通过使用位段,我们可以将年份、月份和日期分别存储在一个字节内,总共只需要4个字节。这样可以有效地减小内存占用,但需要注意的是,位字段的位数必须小于或等于其所属成员变量类型大小的位数。此外,位字段还受限于平台和编译器的限制,对于不同的系统和编译器,行为可能会有所不同,因此在使用位段时要小心考虑跨平台和可移植性的问题

(不同编译器不同,VS2022是4个字节,也有些是3个字节)

2.位段的内存分配——泾渭分明,军阀规定地盘

在这里插入图片描述
在这里插入图片描述
举个例子,刚刚开始是a:3个比特,b:4个比特,c:5个比特,d:4个比特。

出庄,论功行赏,多劳多得
a 出3,b出4,c出5,d出4

abcd四个人规划地盘(绿色空间),划分好了就互不侵犯了。

什么意思?几个意思?我来告诉你——一个开始不是开了三个的绿色的空间)吗?
(一个char型1字节,8比特位)
因为人家a是先定义声明的并且规定3个比特,意思是a先占据了第一个绿色空间的后3个位,后三个0的空间是他的。

然后b来了,因为你第一个绿色空间还有5个比特位,而且你b只需要4位,所以b必须要占第一个绿色空间的4-7位。那么c来了之后他需要5个比特位,怎么办?第一个绿色空间只剩下了一个比特位,所以c必须去第二个绿色空间后5位。最后按规则d去了第三个绿色空间后四位。

abcd入驻军队,如果前面人数不够就补0

最后规定好自己的领地之后互不侵犯,赋值的时候先把全部变量搞成0,再把10赋值给a,因为10的二进制01010——但是你只有3个位置,所以你只能拿后三位010放进去
b=12的(二进制01100)——位置够可以放进去(位数不够就可以前面可以补0,这个无伤大雅,二进制前面补0只要不超过32位,不改变符号位都无所谓的)。c和d以此类推。

> 最终二进制化为十六进制——十六进制(书面显示更紧凑)

拓展——十六进制好处
十六进制在计算机中的处理更加高效。一方面,内存地址在计算机中通常采用字节(8个比特)为单位,而十六进制正好可以充分利用每个字节的8个比特,因为每个十六进制位对应4个比特。另一方面,在二进制和十六进制之间进行转换的计算也相对简单和高效,可以通过位移和逻辑运算等操作来实现

3.位段跨平台的局限性和应用

在这里插入图片描述
在这里插入图片描述
C++位段(Bit fields)可以用于在结构体或类中定义成员变量的位数,从而节省内存空间,并且可以更高效地处理特定的位操作。下面是一些C++位段的应用举例:

1.压缩数据结构:

用于存储非常数范围的数据,但是数据范围相对较小且可预测的情况。例如,可以使用位段来存储标志位、状态值或记录控制信息,从而减小数据结构的占用空间。

struct FlagBits {unsigned int isVisible : 1;  // 1位用于表示是否可见unsigned int isEditable : 1;  // 1位用于表示是否可编辑unsigned int isSelectable : 1;  // 1位用于表示是否可选择// 其他成员...
};

2.位操作和通信协议:

位段可以用于与底层硬件通信时,对数据进行位操作或者解析通信协议中的标识位。例如,可以使用位段来定义特定的位字段,以便对数据进行按位操作和提取。

struct Message {unsigned int messageType : 4;  // 4位用于表示消息类型unsigned int payload : 8;  // 8位用于表示有效载荷数据// 其他成员...
};

3原始数据序列化:

位段可以用于将数据序列化为二进制,并且可以更加紧凑地表示数据。例如,可以使用位段将结构体中的各个字段压缩为指定的位数,然后将其传输或存储。

struct SensorData {float temperature;  // 温度float humidity;  // 湿度unsigned int pressure : 14;  // 14位用于表示压力值(范围在0-16383)unsigned int status : 2;  // 2位用于表示状态信息// 其他成员...
};

后记:需要注意的是,位段的行为受编译器和平台的影响,可能在不同的系统和编译器上有所不同。此外,位段的使用也需要小心考虑可移植性和对齐问题,并且在处理位操作时需要注意位的顺序和对齐。因此,在使用位段时,建议查阅编译器文档以获取更详细的信息,并进行相应的测试和验证。

这篇关于位段——(详细图解,保姆宗师级教程,包会,从基础概念到精通实战应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236468

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

python库fire使用教程

《python库fire使用教程》本文主要介绍了python库fire使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1.简介2. fire安装3. fire使用示例1.简介目前python命令行解析库用过的有:ar