(笔记)结构体-位域

文章介绍了如何通过定义结构体中的位域来优化数据存储,特别是当只需要表示少量状态或模式时。例如,使用位域可以将一个uint8_t字节划分为表示类型的3位,级别的3位和开关的2位,从而节省空间。在接收处理中,可以通过位运算来提取特定信息,如检查开关状态。这种方式在嵌入式系统和网络通信中常见,能有效利用有限的内存资源。

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

摘要

需求说明:需要定义一个结构体,其中的一个值需要通过的方式去处理(如PWM脉冲信号),而不需要uint8_t整个字节。这样做好处

  • uint8_t表示一个字节,有8位。可以用来表示一个0~255的值。若不需要这么大的值呢,若只想表示某个模式的开关,某个系列的几个类型。这样的话,他们对值范围的要求只有几个而已,最多只需要一两位。如果用整个字节来表示的话,太过于浪费。
  • 因此可以采用位域的方式,将单个字节拆分成多个部分,每个部分分配几个位(也可以整个结构体,多个字节重新分配)

使用

如我现在有个uint8_t Test,我希望用这个对象来表示

  • 类型:类型有两种。0x00表示A,0x01表示B
  • 级别:级别有两种。0x00表示a,0x01表示b
  • 开关。0x00表示关,0x01表示开。

由此可知,每个对象用两个位足矣。

因此结构体Mytest
struct Mytest
{
	uint8_t test;
};


可以看作
struct Mytest
{
	uint8_t type:3;        //类型,用3位表示 0b000表示A; 0b001表示B
	uint8_t level:3;       //级别,用3位表示  0b000表示a; 0b001表示b
	uint8_t switch:2;     //开关,用2位表示  0b00表示关; 0b01表示开
};
//该结构体的大小依旧是一个字节

接收处理

如发送的是: Ab开 =0b 000 001 01 (网络通讯注意字节序
接收:通过 &的方式去处理。如想要知道开还是关

auto a = test & 0x01;  //0x01 即 0b 0000 0001

判断a是否是0x01即可

更详细参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值