C struct中的位域 bitfield

本文详细介绍了C语言中struct结构体内位域(bitfield)的概念及其应用。通过具体实例,展示了如何利用位域来高效地存储数据,特别是适用于非字节对齐的变量以及标志位的场景。同时,以蓝牙mesh中的Network-PDU为例,对比了使用位域与掩码的不同实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C struct中的位域 bitfield

结构体的成员可以限制其位域,每个成员可以使用用比字节还小的取值范围,下面的结构体s1中,四个成员每个成员都是2bit的值(0~3),整个结构体占据的空间依然是4个字节,但是第一个字节中表示了四个成员,后续三个字节没有用到。

struct {
    unsigned char a : 2;
    unsigned char b : 2;
    unsigned char c : 2;
    unsigned char d : 2;
} s1;

s1.a = 1;
s1.b = 1;
s1.c = 1;
s1.d = 1;

| 低位  ------>>>>>>>  高位 | 
|  byte 0  ||  byte 1  ||  byte 2  ||  byte 3  |
| 10101010 || 00000000 || 00000000 || 00000000 |

位域限制对于一些非字节对齐的变量,比较有用。有些标志位使用几个个bit就可以表示,这时可以用位域限制。我们以蓝牙mesh中的Network-PDU为例说明。

1146526-20180530133540024-1251608124.png

IVI只占了1 bit,NID占了7bit。我们可以直接用1个字节表示,然后通过移位运算来表示IVI及NID。也可以使用位域,这样表示更加直接,与正常的结构体成员一样。

// 使用位域
struct {
    unsigned char IVI : 1;
    unsigned char NID : 7;
    unsigned char CTL : 1;
    unsigned char TTL : 7;
} net_pdu;

net_pdu.IVI = 1;
net_pdu.NID = 123;

// 使用掩码
struct {
    unsigned char IVI_NID ;
    unsigned char CTL_TTL;
} net_pdu;

net_pdu.IVI_NID |= (1<<7);
net_pdu.IVI_NID = (123) |  ((1<<7)&(net_pdu.IVI_NID));

转载于:https://www.cnblogs.com/gexin/p/9110436.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值