C语言中的位域:节省内存的标志位管理技术
位域(Bit-field) 是 C 语言中的一种特性,允许在结构体(
struct
)中定义占用特定位数的成员变量。通过位域,可以更精细地控制内存的使用,尤其是在需要存储多个布尔值或小范围整数时,可以节省内存空间。
目录
一、位域的基本语法
二、位域的特点
节省内存:
限制范围:
对齐和填充:
三、位域的示例
代码解析
结构体定义:
初始化:
赋值:
输出:
输出结果
四、位域的优缺点
优点:
缺点:
五、位域 vs 手动位操作
总结
一、位域的基本语法
在结构体中定义位域的语法如下:
struct 结构体名 {数据类型 成员名 : 位数;
};
-
数据类型:通常是
int
、unsigned int
、signed int
等整数类型。 -
成员名:位域成员的名称。
-
位数:指定该成员占用的二进制位数。
二、位域的特点
-
节省内存:
-
位域允许将一个整型变量拆分成多个小段,每段占用指定的位数。
-
例如,一个
unsigned int
通常是 4 字节(32 位),可以将其拆分成多个 1 位、2 位或更多位的成员。
-
-
限制范围:
-
位域的位数决定了其能存储的值的范围。例如:
-
1 位的位域可以存储
0
或1
。 -
2 位的位域可以存储
0
到3
。
-
-
-
对齐和填充:
-
编译器可能会在位域之间插入填充位,以满足对齐要求。
-
位域的总大小不能超过其基础数据类型的大小(例如,
unsigned int
的位域总位数不能超过 32)。
-
三、位域的示例
以下是一个使用位域的示例:
#include <stdio.h>// 定义一个包含位域的结构体
struct Flags {unsigned int flag1 : 1; // 1 位,用于存储 flag1unsigned int flag2 : 1; // 1 位,用于存储 flag2unsigned int flag3 : 1; // 1 位,用于存储 flag3unsigned int value : 4; // 4 位,用于存储一个 0~15 的值
};int main() {struct Flags flags = {0}; // 初始化所有位域为 0flags.flag1 = 1; // 设置 flag1 为 1flags.flag3 = 1; // 设置 flag3 为 1flags.value = 7; // 设置 value 为 7// 打印位域的值printf("flag1: %u, flag2: %u, flag3: %u, value: %u\n",flags.flag1, flags.flag2, flags.flag3, flags.value);// 打印结构体的大小printf("Size of struct Flags: %lu bytes\n", sizeof(struct Flags));return 0;
}
代码解析
-
结构体定义:
-
flag1
、flag2
、flag3
各占用 1 位,用于存储布尔值(0 或 1)。 -
value
占用 4 位,可以存储 0 到 15 的值。
-
-
初始化:
-
struct Flags flags = {0};
将所有位域初始化为 0。
-
-
赋值:
-
flags.flag1 = 1;
设置flag1
为 1。 -
flags.flag3 = 1;
设置flag3
为 1。 -
flags.value = 7;
设置value
为 7。
-
-
输出:
-
打印各个位域的值。
-
打印结构体的大小(通常为 4 字节,因为
unsigned int
是 4 字节对齐的)。
-
输出结果
flag1: 1, flag2: 0, flag3: 1, value: 7
Size of struct Flags: 4 bytes
四、位域的优缺点
优点:
-
节省内存:适合存储多个小范围的整数或布尔值。
-
代码可读性:可以直接通过成员名访问位域,代码更直观。
缺点:
-
可移植性差:位域的行为依赖于编译器的实现,不同编译器可能会有不同的对齐和填充规则。
-
性能开销:访问位域可能比访问普通变量慢,因为需要额外的位操作。
五、位域 vs 手动位操作
-
位域:语法简洁,适合简单的标志位管理,但可移植性差。
-
手动位操作:通过位掩码和位操作实现,灵活性高,可移植性好,但代码稍复杂。
例如,以下代码使用手动位操作实现了与位域相同的功能:
#include <stdio.h>struct Flags {unsigned int data; // 使用一个整型变量存储所有标志位
};#define FLAG1_MASK 0x01 // 00000001
#define FLAG2_MASK 0x02 // 00000010
#define FLAG3_MASK 0x04 // 00000100
#define VALUE_MASK 0xF0 // 11110000(高 4 位)void setFlag(struct Flags *flags, int mask) {flags->data |= mask;
}void clearFlag(struct Flags *flags, int mask) {flags->data &= ~mask;
}int checkFlag(struct Flags *flags, int mask) {return (flags->data & mask) != 0;
}void setValue(struct Flags *flags, int value) {flags->data = (flags->data & ~VALUE_MASK) | ((value << 4) & VALUE_MASK);
}int getValue(struct Flags *flags) {return (flags->data & VALUE_MASK) >> 4;
}int main() {struct Flags flags = {0};setFlag(&flags, FLAG1_MASK);setFlag(&flags, FLAG3_MASK);setValue(&flags, 7);printf("flag1: %d, flag2: %d, flag3: %d, value: %d\n",checkFlag(&flags, FLAG1_MASK),checkFlag(&flags, FLAG2_MASK),checkFlag(&flags, FLAG3_MASK),getValue(&flags));printf("Size of struct Flags: %lu bytes\n", sizeof(struct Flags));return 0;
}
总结
-
位域 是一种节省内存的技术,适合存储多个小范围的整数或布尔值。
-
位域的语法简单,但可移植性差,适合在特定平台上使用。
-
如果需要更好的可移植性和灵活性,可以使用手动位操作代替位域。
相关文章:
C语言中的位域:节省内存的标志位管理技术
位域(Bit-field) 是 C 语言中的一种特性,允许在结构体(struct)中定义占用特定位数的成员变量。通过位域,可以更精细地控制内存的使用,尤其是在需要存储多个布尔值或小范围整数时,可以…...
单端信号差分信号
单端信号和差分信号是电路中常见的两种信号传输方式,它们在具体的应用场景和特点上有着明显的区别。下面就来详细说明一下单端信号和差分信号的区别。 首先,单端信号是指信号通过一个信号线传输,通常一个信号线携带一个信号。这种传输方式适…...
数据设计(范式、步骤)
文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式,指导如何设计一个关系型数据库。 1NF: 关系表的每个字段,都应该是不可再分的,——保证原子性。 字…...
Linux 中查看文件大小方法
目录 方法一:ls -l 输出的第五列方法二:du 命令的输出信息方法三:stat -c %s 的输出 方法一:ls -l 输出的第五列 ls 是列出指定目录下文件列表的命令,通过 -l 选项可以显示文件的属性信息,第五列显示的就是…...
SEO(搜索引擎优化)详解
SEO(搜索引擎优化)详解 SEO是Search Engine Optimization的缩写,中文称为"搜索引擎优化"。它是指通过一系列技术和方法,提高网站在搜索引擎自然(非付费)搜索结果中的排名,从而获得更…...
软考-高项,知识点一览十二 质量管理
十二 质量管理 项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求,以满足干系人目标的各个过程。 项目质量管理需要兼顾项目管理与项目可交付成果两个方面,它适用于所有项目,无论项目的可付成果具有何种特性。 管…...
Docker 设置国内镜像源
Windows 和 macOS 用户 1、一般使用Docker Desktop软件,在 Docker Desktop 的图形界面中完成镜像源的更换操作。具体步骤如下: 打开 Docker Desktop 后,在菜单栏依次点击 Settings -> Docker Engine。此时会弹出一个 JSON 编辑框…...
探秘Transformer系列之(19)----FlashAttention V2 及升级版本
探秘Transformer系列之(19)----FlashAttention V2 及升级版本 文章目录 探秘Transformer系列之(19)----FlashAttention V2 及升级版本0x00 概述0x01 FlashAttention V21.1 动机1.2 方案1.2.1 减少冗余计算1.2.2 增加并行1.2.3 调整…...
《白帽子讲 Web 安全》之跨站请求伪造
引言 在数字化时代,网络已深度融入人们生活的方方面面,Web 应用如雨后春笋般蓬勃发展,为人们提供着便捷高效的服务。然而,繁荣的背后却潜藏着诸多安全隐患,跨站请求伪造(CSRF)便是其中极为隐蔽…...
C++20:make_shared_for_overwrite与make_unique_for_overwrite
文章目录 一、背景与动机二、std::make_shared_for_overwrite2.1 语法与用法2.2 优势 三、std::make_unique_for_overwrite3.1 语法与用法3.2 优势 四、应用场景4.1 高性能计算4.2 大型对象管理4.3 实时系统 五、总结 C20 引入了两个新的标准库函数: std::make_sha…...
北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…...
【React】基础版React + Redux实现教程,自定义redux库,Redux Toolkit教程
本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…...
onlyoffice实现office文件在线编辑保存
一、简介 onlyoffice是开源的在线文档编辑软件,支持主流的office格式,可实现文档在线编辑保存,多人协作编辑等场景,是目前我用过的功能最完善且强大的在线office编辑软件; 二、安装onlyoffice 这里仅介绍docker安装 简单运行查看sudo docker run -i -t -d -p 80:80 --…...
Transformer革命:人工智能如何突破语言理解的边界
Transformer革命:人工智能如何突破语言理解的边界? 当你在手机输入法中打出"苹果"时,系统是否知道你要输入水果还是手机品牌?这个看似简单的选择,背后隐藏着自然语言处理领域二十年来最深刻的变革。2017年谷…...
禅道品牌全面战略升级:开创项目管理国产化替代新格局
2025年,禅道软件完成企业品牌战略深度升级。此次升级,从产品力、服务力到生态圈构建等方面进行了全面优化,以更智慧的解决方案、更开放的生态布局,更安全的国产化解决方案,助力企业实现从“工具应用”到“价值创造”的…...
软件项目管理课程之第4讲:软件需求管理
讲授内容 项目案例 软件需求管理的基本概念 软件需求开发 软件需求管理 项目案例 案例背景:小王作为软件项目负责人,带领团队开展需求调查工作,但在需求分析和后续开发过程中出现了一系列问题。 问题表现: 项目规模庞大&…...
java基础知识和语法
1.类的信息加载完成后,会自动调用静态代码块,可以完成静态属性的初始化功能 对象准备创建时,也会自动调用代码块,但不是静态的; public class java_3_24 {public static void main(String[] args) {new User08();}} …...
横扫SQL面试——事件流处理(峰值统计)问题
横扫SQL面试 📌 事件流处理(峰值统计)问题 “会议室预定冲突怎么查? 🔍 服务器瞬时负载如何算?🎢 健身房的‘人挤人’高峰究竟出现在几点?🏃♂️” 这些看似毫不相干…...
如何降低频谱分析仪的底噪
测量微小信号的时候,底噪可能会淹没有用的信号:(如下图,底噪为-60dB) 如何降低底噪: 1.分辨率带宽RBW设置小一点,可以减小信号的底噪 2.减小衰减器(频谱分析仪底噪的功率随着输入衰…...
C语言基础知识09---文件操作
目录 文件操作 1.1 文件操作 1.2 文件操作的数据传输形式 1.3 文件操作的分类 1.4 文件存储格式 1.5 文件流指针 1.6 函数名:fopen() 1.7 函数名:fclose() 1.8 函数名:fprintf() 1.9 函数名:fscanf() 1.10 函数名&…...
GRS认证的主要步骤是什么?
GRS认证的具体步骤,是一个严谨而系统的过程,旨在确保产品从原料来源到最终消费的每一个环节都符合全球回收标准(Global Recycle Standard,简称GRS)的严格要求。 首先,企业需要向GRS认证机构提交申请&#…...
探究 CSS 如何在HTML中工作
2025/3/28 向全栈工程师迈进! 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说,其显示效果如下࿱…...
软件工程面试题(七)
1、DAO设计模式及DELEGATE模式 DAO(Data Access Object)模式实际上是两个模式的组合,即Data Accessor 模式和 Active Domain Object 模式,其中 Data Accessor 模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式实现了业务数据的对象化封装,一般我们将这两…...
AfxMessageBox()如何显示string字符串
书籍:《Visual C 2017从入门到精通》的2.7 字符串 环境:visual studio 2022 内容:几个字符串类型->(将单字节char*转换为宽字节wchar_t *) 在 MFC 中,AfxMessageBox 默认支持显示 CString 或宽字符字符…...
基于 kubekey -实现懒人一键部署K8S集群
基于 kubekey -实现懒人一键部署K8S集群 操作步骤 官网: https://kubesphere.io/zh/ 一、执行以下命令快速创建一个 Kubernetes 集群。 Master节点 如果您访问 GitHub/Googleapis 受限,请登录 Linux 主机,执行以下命令设置下载区域。 [roott…...
19款超级华丽动画的图片轮播HTML5+CSS3模板源码
大家好,我是分享源码和设计思想的程序媛, 今天给大家分享一个 19款超级华丽动画的图片轮播HTML5CSS3模板源码。 纯CSS3HTML5代码实现,没有任何其它杂乱的框架东西。 图片演示 1. 3D立方体轮播效果 2. 视差滚动轮播效果 3. 卡片堆叠轮播效果 4…...
第十六:redis 的 帖子投票要点
ZADD orders 100 order1 ZADD orders 200 order2 ZADD orders 300 order3 zadd myzset 100 nameorder // 添加一个有序集合 其中存储了用户的订单信息,每个订单用一个唯一的 ID 表示 ZSCORE myzset nameorder // myzset 是key nameorder 是成员ÿ…...
51c深度学习~合集4
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327892 #robustlearn 本文提出了「鲁棒关键微调」,通过「微调」对抗训练模型的「非鲁棒关键性模块」,充分利用其冗余能力提升泛化性。 对抗训练(Adversarail Training)…...
解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题
亲测可用 打开虚拟机设置,关闭加速3D图形 (应该是显卡驱动的问题,不知道那个版本的驱动不会出现这个问题,所以干脆把加速关了)...
Arduino硬件控制开发基础资料
Arduino 的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。 结构部分 一、结构 1.1 setup() 1.2 loop() 二、结构控制 2.1 if 2.2 if...else 2.3 for 2.4 switch case 2.5 while 2.6 do... while 2.7 break 2.8 cont…...
地图项目入手学习
如果你目前对自己的地图项目实现原理不太了解,周末可以通过以下方法进行高效学习: ⸻ 第一步:梳理项目相关代码(3 小时) 目标:先大致了解你的地图项目代码,找到核心实现逻辑。 具体做法&…...
OpenCV图像处理:边缘检测
文章目录 前言一、什么是边缘检测?二、算法分类1、Sobel算子2、Scharr算子3、Canny边缘检测3.1 Canny检测的优点3.2 Canny 边缘检测分为 4 个部分3.2.1 、图像降噪3.2.2 、梯度计算3.2.3 、非极大值抑制3.2.4 、双阈值边界跟踪 4、算法比较 三、代码实现总结 前言 …...
性能测试~
1.什么是性能测试 1.什么是性能 就像这两个车一样,虽然都是代步工具,构造都是一样的,但是路虎的发动机要比捷达好.路虎的百米加速却是比捷达快的,我们就知道路虎的性能要比捷达好 . 那么什么是软件的性能呢?我们分析一下 2.常见的性能测试指标 2.1并发数 并发数是指在同一…...
pagehelper 分页插件使用说明
pom.xml:pageHelper坐标 <!--pageHelper坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency> 分…...
使用crypto-js进行DES加/解密
crypto-js 官方网站:https://github.com/brix/crypto-js 中文参考教程:前端加密JS库–CryptoJS 使用指南 在线加解密网站:https://www.mklab.cn/utils/des 首先要安装crypto-js库,根据自己使用的方式按照官方网站步骤进行即可。 …...
【图片识别Excel表格】批量将图片上的区域文字识别后保存为表格,基于WPF和阿里云的项目实战总结
一、项目背景 在信息处理和文档管理中,经常会遇到需要从大量图片中提取文字并进行整理的场景。例如,财务部门需要从大量报销票据中提取金额、日期等信息;法务部门需要从合同文档中提取关键条款;教育行业需要从试卷中提取学生的答题内容等。传统的手工处理方式不仅耗时长、…...
在 i.MX8MP 上用 C++ 调用豆包 AI 大模型实现图像问答
本文介绍了如何在 i.MX8MP 嵌入式平台上使用 C 调用豆包 AI 大模型(Doubao-vision-pro-32k)进行图像问答。我们将详细讲解代码实现的各个步骤,包括文件读取、Base64 编码、构造 JSON 请求体、使用 libcurl 进行 HTTP POST 请求以及解析响应数…...
uni-app自动升级功能
效果图 一、VUE login.vue <template><view><view class"uni-common-mt"><view class"uni-flex uni-column"><view class"flex-item flex-item-V"><view class"logo"><image src"/st…...
线性回归 + 基础优化算法
线性回归 线性回归是机器学习最基础的模型,也是理解后续所有深度学习的基础。 线性模型可以看做是单层神经网络。 上述有个0.5是在求导的时候可以很方便的将2消去。 实际上,这里的数据样本受限很大,比如地球上房子就那么多,肯…...
MyBatis分页插件混用问题解析:IPage与PageHelper的冲突与解决
一、背景 在同时使用 MyBatis-Plus 的 IPage 分页 和 PageHelper 时,开发者可能会遇到以下两类问题: 分页结果异常:IPage 查询的 total 总条数返回 0,但实际数据正常。依赖冲突报错:启动时报错 Column.withColumnNam…...
4.Socket类、InetAddr类、Epoll类实现模块化
目录 1. InetAddr类 类定义 代码说明 类实现 2.Socket类 类定义 类实现 3. Epoll类 类定义 构造与析构函数 方法实现 类实现 4. 使用模块化设计 示例使用(main.cpp) 5. 运行程序 随着程序复杂度的增加,单一的面向过程的代码会变得难以理…...
19 python 模块
在办公室的日常工作中,我们常常会用到各种各样的工具,像计算器用于计算数据、打印机用来打印文件、订书机将纸张装订成册等。这些工具会被反复使用,而且不同的工具具有不同的功能。 一、模块的定义 在 Python 里,模块就如同一个…...
医疗智能体通信整合-大模型训练中沟通优化策略研究
一、引言:医疗模型训练的沟通困境 1.1 医疗 AI 发展背景 在数智化浪潮的推动下,医疗 AI 正以前所未有的速度融入现代医疗体系。从智能影像诊断助力医生精准识别病灶,到基于大数据分析的个性化药物研发,医疗 AI 在提升医疗效率、改善医疗质量方面展现出巨大潜力。据相关数据…...
LearnOpenGL-笔记-其六
今天我们来聊一些更深入的东西: Depth Testing 在之前的学习过程中,我们有接触过深度缓冲,彼时的深度缓冲的意义就是可以让我们体现出深度的差异从而达到立体的效果,而现在我们将在深度缓冲的基础进一步扩展,进行深度…...
【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Windows 10更新失败解决方法
在我们使用 Windows 时的时候,很多时候遇到系统更新 重启之后却一直提示“我们无法完成更新,正在撤销更改” 这种情况非常烦人,但其实可以通过修改文件的方法解决,并且正常更新到最新版操作系统 01修改注册表 管理员身份运行注…...
【安当产品应用案例100集】042-基于安当KADP实现机密文件安全流转
一、客户需求 某集团公司客户,在系统业务流中,存在大量的内部文件流转的需求。内部业务文件有不同的安全密级,最初在文件流转时,公司内部规定点对点的文件传输,要使用加密工具加密后再发给需要的一方。这种方式虽然能…...
【网络】Socket套接字
目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API (1)socket (2)bind sockaddr结构 (3)listen (4)a…...
蓝桥杯[每日一题] 真题:连连看
题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中,每个格子中都有一个整数,第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等,且它…...
新手SEO优化实战快速入门
内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…...