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