(笔记)结构体-位域

摘要

需求说明:需要定义一个结构体,其中的一个值需要通过的方式去处理(如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即可

更详细参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值