位段详细解释

news2024/10/5 13:12:19

结构体位段的使用原则 

在C语言中,结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的实体。位段(Bit Field)是结构体中的一个特殊成员,它允许我们只取结构体中的某个位范围的数据,而不是整个字段。位段可以用来高效地访问和操作内存中的位。
位段的定义格式如下:


struct 位段名 {
    unsigned int 位段1:宽度;
    unsigned int 位段2:宽度;
    ...
    unsigned int 位段N:宽度;
} 变量名;

这里,`位段名`是结构体的名称,`位段1`到`位段N`是结构体中的位段名称,`宽度`是指定每个位段占据的位数。`unsigned int`表示位段的数据类型,它保证了位段中的每一位都是非负数。
例如,以下是一个定义了一个包含三个位段的结构体:


struct RGB {
    unsigned int red : 5;
    unsigned int green : 6;
    unsigned int blue : 5;
} pixel;


在这个例子中,`RGB` 结构体有三个位段:`red`、`green` 和 `blue`。每个位段分别占据了 5 位、6 位和 5 位。这样的结构体可以用来表示一个颜色像素的三原色值。
位段的访问可以通过位运算符来进行,例如`&`(按位与),`|`(按位或),`^`(按位异或),`~`(按位取反),`<<`(左移),`>>`(右移)等。
位段的使用可以节省存储空间,并且可以很方便地通过位运算符来操作特定范围的位。这在需要对内存中的位进行精细控制时非常有用。

———————————————————————————————————————————

结构体位段的原理解剖

这里的_a等等这个是变量名称

这里的2是宽度,也就是只要几个字节的意思

结构体内存对齐的时候为了节约时间,导致空间的浪费。

而位段的使用,就是节约空间,但是会导致时间的增长,其实本质时间的差别不是特别大,当然会有。

位段的单位是比特 bit,一个字节8个比特。

解释

存在的意义

程序员不需要那麽多的空间 就产生了位段

———————————————————————————————————————————

位段的内存分配举例1

首先我们知道位段的使用是在内存里面的分配是字节和字节之间是从低地址到高地址,也就是字节之间的存储是从左到右 

首先我们知道位段的单位是比特bit,此时需要知道,位段之间的存储的在字节内,从右到左的方式进行存储,如果我们需要存储的第一个字节是7个bit,第二个存储的位段占据的空间是6个bit,这个时候第二个位段的存储不会直接从右到左的第八个字节直接进行存储。而是会从第二个字节从新开始进行存储,因为计算机在存储的时候,是可以直接计算出来的,当计算到剩下的空间不足以存储剩余的bit多少时候,他会去下一个字节空间进行存储。

这样的目的是防止数据的丢失。连续的存储的时候,计算机拿出来的时候是需要进行重新计算的,而且很容易导致丢失数据。所以当剩余的存储空间不能满足完全存下这个位段的时候,会去下一个空间进行存储。

图解

从右向左

接下来我们继续进行计算

当然更一下,在vs的编译器里面,位段的存储是字节之间采取从右向左

这里是长度不够的时候申请一个字节的长度

内部是从右向左使用

举例1原理解释

简单的说也就是再进行存储的时候,也就发生了截断

也就是10 12 3 4 实际上是发生了截断

所以也就是

0x 62 03 04

—————————————————————————————————————————— 

位段的内存分配举例2

同理这里也是一样的

这里是2 5 10 30个bit

int是4个字节 也就是32bit

—————————————————————————————————————————— 

位段的应用

需要节省内存的时候用位段

需要节约时间的时候 用结构体


—————————————————————————————————————————— 

位段的应用和使用时候的注意事项

ab可能共用一个字节

不能对位段的成员使用&操作符(看清楚 这里是错误的)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专注无线MCU:STM32WL33CCV6A、STM32WL33CCV7A、STM32WL33K8V7TR、STM32WL33KBV7TR设计用于RF无线应用

一、STM32WL33CC &#xff1a;Sub-GHz无线微控制器&#xff0c;单核Arm Cortex-M0 概述 STM32WL33xx是一款高性能超低功耗无线应用处理器&#xff0c;用于1 GHz以下频段的RF无线应用。它设计用于在免许可ISM和SRD频段&#xff08;如433、868和915 MHz&#xff09;下工作。 …

Apache Spark

一、Apache Spark 1、Spark简介 Apache Spark是用于大规模数据 (large-scala data) 处理的统一 (unified) 分析引擎。 Spark官网 Spark最早源于一篇论文Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing,该论文是由加州大学柏…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…

Python---常用的web框架

目录 Django创建Django项目启动Django项目引入APP视图函数例如纯文本JSON格式数据重定向渲染页面返回错误提示 FlaskPyramidTornado Django 特点&#xff1a;Django是一个全功能的Web框架&#xff0c;提供了许多内置的功能和工具&#xff0c;如ORM、表单处理、认证等。它的设计…

AWS EC2 学习之: 使用 PuTTY 从 Windows 连接到 Linux 实例

启动您的实例之后&#xff0c;您可以连接到该实例&#xff0c;然后像使用您面前的计算机一样来使用它。 注意 启动实例后&#xff0c;需要几分钟准备好实例&#xff0c;以便您能连接到实例。检查您的实例是否通过了状态检查。您可以在 Instances 页上的 Status Checks 列中查…

Python基础学习笔记(二)

Python基础语法 注释 注释有: 单行注释、多行注释、文档注释。 单行注释采用 # 符号,后面跟随的都是注释内容多行注释采用 (三个单引号) 或者 """(三个双引号) 包围文档注释采用 """ 包围&#xff0c;一般出现在模块&#xff0c;类&#xff0c;…

AI:Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略

AI&#xff1a;Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略 目录 Nvidia官网人工智能大模型工具合集的简介 1、网站主要功能包括: Nvidia官网人工智能大模型工具合集的使用方法 1、SDXL-Turbo的使用 2、GEMMA-7B的…

MySQL三种开窗函数详细用法,图文详解

开窗函数的详细用法 第一章、开窗函数的语法1.1&#xff09;从聚合开窗函数讲起1.2&#xff09;开窗函数之取值1.3&#xff09;排名开窗函数 第一章、开窗函数的语法 开窗函数的语法为&#xff1a;over(partition by 列名1 order by 列名2 )&#xff0c;括号中的两个关键词par…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代&#xff0c;视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式&#xff0c;这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式&#xff0c;帮助读者轻松应对不同设备和平台的需…

JavaEE企业开发新技术4

2.16 模拟Spring IOC容器功能-1 2.17 模拟Spring IOC容器功能-2 什么是IOC&#xff1f; 控制反转&#xff0c;把对象创建和对象之间的调用过程交给Spring框架进行管理使用IOC的目的&#xff1a;为了耦合度降低 解释&#xff1a; 模仿 IOC容器的功能&#xff0c;我们利用 Map…

Android内存优化项目经验分享 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率&#xff0c;做了内存优化和下载导出优化&#xff0c;具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍&#xff1a; 一.拍摄前预览页面优化 预览效果问题 存在…

2024-简单点-pandas

pandas pandas to numpy 尽量不用.values提取数据 numexpr 和 bottleneck加速 布尔操作 describe 自定义describe .pipe df.apply 行或者列级别函数级别应用

更好,更快,更健壮的Android时区更新方式

更好,更快,更健壮的Android时区更新方式 又到了一年一度我们要调整时钟的时候了!哦,等等,你的安卓设备是不是已经自动调整了?对于许多生活在各国的安卓用户来说,这可能并不奇怪。例如,在美国、欧盟和英国,政府已经有一段时间没有改变他们的时间立法,因此用户每天早上…

【PyTorch][chapter 24][李宏毅深度学习][ CycleGAN]【理论】

摘要(Abstract)&#xff1a; 本篇主要参考论文分享一下CycleGAN. CycleGAN是实现不同图像之间风格的转换,并且样本数据无需配对即可实现转换 图像到图像的转换是一类视觉和图形问题&#xff0c;其目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射&#xff08;P…

微服务高级篇(四):多级缓存:Nginx本地缓存 --- Redis缓存 --- 进程缓存

文章目录 一、多级缓存概念二、准备工作【导入案例&#xff0c;并搭建Nginx反向代理】2.1 导入商品案例2.1.1 安装MySQL2.1.2 导入SQL2.1.3 导入Demo工程2.1.4 启动2.1.5 导入商品查询页面 三、JVM进程缓存【第三级缓存】3.1 本地进程缓存与分布式缓存的区别3.2 本地进程缓存&a…

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇

接着上一篇《厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇》继续总结一下厨余垃圾处理设备智能软硬件统的原理。所有的软硬件系统全是自己一人独自开发&#xff0c;看法和角度难免有局限性。希望抛砖引玉&#xff0c;将该智能软硬件系统分享给更多有类…

字节算法岗二面,凉凉。。。

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后&#xff0c;总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的&#xff0c;反正能用就行。 安装官方驱动的办法其实很简单&#xff0c;现在独立显卡一共就那么几家&#xff0c;最常见的显卡就是Nvidi…

【Maven】高效入门

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图&#xff08;了解&#xff09; 二、Maven安装和配置1. Maven…

iOS-UIFont 实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS-UIFont 实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…