结构体中的冒号:位域

C语言:【位域操作】(结构体中使用冒号) 文章目录一、 什么是C语言位域操作(结构体中使用冒号)1.1 位操作1.2 位域操作产生的原因1.3 位域操作1.4 备注二、位域操作示例——4字节(32bit)变量操作2.1 代码2.2 打印结果三、位域操作示例——1字节(8bit)变量操作3.1 代码3.2 打印结果四、寄存器定义使用示例——32位寄存器实例4.1 结构体定义:头文件reg.h中定义寄存器通用类型4.2 结构体定义:头文件am437x_io_mux.h中定义外设模块寄存器4.3 结构体使用:文件spi.c 一、 什么是C语言位域操作(结 阅读详情

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: 
struct 位域结构名 
{ 位域列表 }; 
其中位域列表的形式为: 类型说明符 位域名:位域长度 
例如: 
struct bs 
{ 
int a:8; 
int b:2; 
int c:6; 
}; 
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: 
struct bs 
{ 
int a:8; 
int b:2; 
int c:6; 
}data; 
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: 
struct bs 
{ 
unsigned a:4 
unsigned :0 /*空域*/ 
unsigned b:4 /*从下一单元开始存放*/ 
unsigned c:4 
} 
这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 
2. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: 
struct k 
{ 
int a:1 
int :2 /*该2位不能使用*/ 
int b:3 
int c:2 
}; 
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
简而言之,言而简之
这是位域操作的表示方法,也就是说后面加上“:1”的意思是这个成员的大小占所定义类型的1 bit,“:2”占2 bit,依次类推。当然大小不能超过所定义类型包含的总bit数。 
一个bytes(字节)是8 bit(bit)。例如你的结构中定义的类型是u_char,一个字节,共8bit,最大就不能超过8。 
32位机下, 
short是2字节,共16bit,最大就不能超过16. 
int是4字节,共32bit,最大就不能超过32. 
依次类推。 
这样定义比较省空间。例如你上面的结构,定义的变量类型是u_char,是一字节类型,即8bit。 
fc_subtype占了4bit,fc_type占2bit,fc_protocol_version占2bit,共8bit,正好是一个字节。 
其他八个成员,各占1bit,共8bit,正好也是一个字节。 
因此你的结构的大小如果用sizeof(struct frame_control)计算,就是2bytes.

 

--------------------------------------------------------------------------------------------

结构体中的冒号
   今天看CRC的bit型算法学到了C++中的结构体定义可以使用":",具体说明如下:
在标准C语言中,下面的语句是合法的: 
        struct test{
                int a:3;
        };
这样定义的 a 在赋值后只取最后的3bit,即转换为 -4 到 3 之间的数值。比如: 

赋值-5-4-3-22345
实际值3-4-3-223-4-3

如果 a 为无符号型,则会转换为 0 到 7 之间。且同样适用于非 int 的其他类型(只是“:”后面的数和显示 a 的结果时一定要是整型)。 
其中赋值'-5(dec)'=1101(原)=1011(补),所以在进行取后3位操作后变成'3(dec)',当然在CRC运算的结构体定义中,肯定是只用到了最后一位,具体定义如下:
typedef unsigned char bit;
typedef unsigned char byte;
typedef unsigned short u16;
    
typedef union {
    u16 val;
    struct {
        u16 bit0 : 1;
        u16 bit1 : 1;
        u16 bit2 : 1;
        u16 bit3 : 1;
        u16 bit4 : 1;
        u16 bit5 : 1;
        u16 bit6 : 1;
        u16 bit7 : 1;
        u16 bit8 : 1;
        u16 bit9 : 1;
        u16 bit10 : 1;
        u16 bit11 : 1;
        u16 bit12 : 1;
        u16 bit13 : 1;
        u16 bit14 : 1;
        u16 bit15 : 1;
    } bits;
} CRCREGS;
PS:以后我尽量把自己学习的心得体会写上来,免得以后忘了:)当然一些逻辑设计的电路图实在不好画的,我就写在NOTEBOOK上面了。。。
把 ABAP Unit 测试放进本地类:让重构更安全、让测试更好找的组织方式 ABAP测试代码组织策略:单元测试与集成测试的合理存放位置 本文针对ABAP开发中测试代码组织混乱的问题,提出了一套系统化的解决方案: 单元测试应存放在被测类的本地测试include中(...CCAU或...T99),确保测试与代码同步演进且易于发现 跨对象测试(组件/集成/系统测试)应创建单独的全局测试类,并通过FOR TESTING和ABSTRACT进行防护 使用! @testing注释建立测试关系,使测试与被测对象明确关联,提高可发现性 针对不同技术栈(RAP/CAP/OData)提供了具体落地建议, 阅读详情

相关推荐

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 622

C语言结构体--位域

有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。比如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。 eg: struct test{ unsigned m; unsigne...

weixin_30896511的博客 1278

STM32与AD7606的SPI通信优化:提升高精度数据采集效率

本文深入探讨了STM32与AD7606的SPI通信优化策略,旨在提升高精度数据采集系统的效率与稳定性。文章从硬件连接、电源去耦、PCB布局等基础环节入手,详细解析了软件驱动中SPI模式配置、DMA应用及精准时序控制等关键优化技术,并提出了系统级的性能提升方案,帮助开发者解决高速采样下的数据跳动、效率瓶颈等实际问题。

weixin_29192211的博客 392

c语言bit类型数组,【C语言简单说】十七:数组

** ( ´´ิ∀´ิ` ) 还有两个小节就基本上简单的过了一遍C语言了,现在我们来讲诉什么是数组。**字面意思:数组,数组的一个组?应该说一堆数值的一个集合?我不知道大家的年龄段在于什么阶段,如果学过集合的话,大家应该知道数的集合吧?其实数组可以说是值的集合。数组可以分成一位数组、二维数组、多维数组。数 组是有序数据的集合,可以是整型,字符型,但是类型必须一定要相同。我在这里换一个说法吧,直接先...

weixin_39753584的博客 585

【开源~磁悬浮】零代码,纯硬件闭环:从霍尔到H桥的磁悬浮稳定术

本文详细介绍了如何不依赖任何代码,仅通过模拟和数字电路的组合,实现一个完整的磁悬浮闭环控制系统。从霍尔传感器检测位置,到运放电路进行信号调理与模拟PID控制,再到H桥驱动电磁铁执行纠偏,全程使用基础电子元器件搭建。文章深入剖析了系统原理、电路设计、调试技巧与实践经验,展现了纯硬件实现自动控制的独特魅力与挑战。

perl8的博客 620

Halcon实战:如何快速找到图像中的多个圆并计算圆心距离(附完整代码)

本文详细介绍了Halcon在工业视觉检测中快速定位图像中的多个圆并计算圆心间距离的实战方法。通过两种核心算法(阈值分割和动态阈值)的对比分析,结合完整代码示例和参数调优技巧,帮助开发者高效解决多圆检测问题,提升工业检测精度与效率。

weixin_33701251的博客 316

结构体bit位定义

这里写自定义目录标题KEIL工程中进行寄存器定义示例 KEIL工程中进行寄存器定义 示例 // reg typedef struct { u_int32 aaa :8; // bit[ 0~7] u_int32 bbb :6; u_int32 ccc :4; u_int32 ddd :8; u_int32 eee :3; u_int32 fff :3; //bit[29~31] } M_REG; 上述定义了一个32bit的寄存器结构体,并对每一bit进行了声明,从上到下从bit[0]

lwlwinner的博客 2251

YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 1364

关于结构体指定位数

“Short a:4”——指定位数的成员变量 结构体或类中有时会见到下面的写法 struct s {     short a:4;     short b:6;     short c:8; }; 这是结构体和类的一种性质,在声明变量的同时指明变量的位数。 short类型在32位机上本来是16位的,但从节约空间等角度的考虑,我们觉得用16位来存储有

garfield0905的专栏 2952

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4209

百度百科 X-Bk-Token 算法还原

百度百科 X-Bk-Token 算法还原

自成背后的博客 1万+

bit结构体好例子

#include <stdio.h> struct bit1 { unsigned a:20; unsigned b:6; unsigned c:2; }test_bit1; struct bit2 { unsigned d:20; unsigned e:6; unsigned f:20; }test_bit2; union UN { unsigned int u; struct { unsigned char a.

wangzhicheng2013的专栏 525

QGis软件 —— 1、Windows10下载安装QGis及插件

QGis —— 1、Windows10下载安装QGis及插件

5158

c++中冒号(:)和双冒号(::)的用法和c/c++ 位域结构体

1.冒号(:)用法 (1)表示结构体内 位域的定义(即该变量占几个bit空间) typedef struct _XXX{           unsigned char a:4;           unsigned char c; }XXX; (2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。

fragno的专栏 1795

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言结构体中的冒号:位域

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。1、一个位域必须存储在同一个字节中,不能跨两个字节。二、 位域变量的说明与结构变量说明的方式相同。2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。其中位域a占8位,位域b占2位,位域c占6位。无名的位域是不能使用的。

Zhangdfhvxdul的博客 617

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言-结构体冒号(:)位域

C语言-结构体冒号(:)位域 https://blog.youkuaiyun.com/qingzhuyuxian/article/details/80619712 posted @ 2019-06-05 11:43 OpFancy 阅读(...) 评论(...) 编辑 收藏 ...

垃圾制造机 247

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

结构体内冒号:的使用——C语言位域操作

位域的问题,第一次碰见,还是在3+1的入班考试中。当时第一次见C语言这样的写法,一下给愣住了,那道题空着也没有写。等下来后,才在网上找有关的解释有个了解。但是当时并没有把它记录下来。今天在复习C语言,数据类型方面的内容时。无意中又想到了这个问题,决定把它的用法总结出来,以备以后使用。有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所

梦想。启航。 745

结构体中的冒号:位域(转载)

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来

imlei2008的专栏 544

python中双冒号_c++中冒号(:)和双冒号(::)的用法和c/c++ 位域结构体

1.冒号(:)用法(1)表示结构体内 位域的定义(即该变量占几个bit空间)typedef struct _XXX{unsigned char a:4;unsigned char c;}XXX;(2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。struct _XXX{_XXX() : y(0xc0) {}};(3) public:和pri...

weixin_39640909的博客 331

C语言冷知识:结构体里冒号的妙用!5分钟搞懂位域节省内存的秘密

本文深入解析了C语言结构体中冒号(位域)的妙用,这是一种用于内存精打细算的底层编程技术。通过位域操作,开发者可以在嵌入式系统、协议解析等场景中,以比特为单位定义结构体成员,从而在保证代码可读性的同时,实现极致的内存节省。文章结合LED控制、IP头部解析等实战案例,详细阐述了其语法、内存布局及与union的配合使用。

weixin_29016865的博客 109
上一篇: TCP/IP详解学习笔记(9)-TCP协议概述
下一篇: 大端与小端存储方式
simonjay2007
博客等级 码龄17年 104粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值