位域简介:
c语言位域是一种很少见但却很常用的技巧,位域能够真正的控制字节、整型等数据类型的每一位。在很多通信协议中,以MQTT协议为例,通常对包头字节的每一位,都赋予的不同的含义。此时,就非常适合使用位域运算。
以下是测试程序:
#include <stdio.h>
typedef struct
{
union bit_union // 联合体
{
// byte和MyStruct共用一个字节,通过修改位域,也修改了byte字节的值
unsigned char byte;
struct MyStruct
{
unsigned char a : 1; // 字节最低位
unsigned char : 6; // 字节空出6位,不可使用
unsigned char b : 1; // 字节最高位
};
};
} bit_area;
int main(void)
{
bit_area my_bs;
my_bs.byte = 0; // 清空字节所有位
printf("位域大小为%d字节.\n", sizeof(my_bs));
my_bs.b = 1; // 字节最高位置1
printf("1000 0000 = %d\n", my_bs.byte);
my_bs.a = 1; // 字节最高位、最低为均置1
printf("1000 0001 = %d\n", my_bs.byte);
getchar();
return 0;
}
这个程序借鉴了MQTT协议的思路,将位域和包头字节做成 union 联合体。这样,我们可以根据协议单独设置每一位,由于 union 类型共用内存,修改位域同时也巧妙的修改了包头字节。
测试结果:
参考博客:
https://blog.csdn.net/guoyong10721073/article/details/8150828
http://c.biancheng.net/view/2037.html