我们通常把一个有某种关联的数据做成结构体,写程序时非常方便,也更有阅读性。有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关、使能、告警等,只用 0 和 1 即可。
为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
举例:
typedef unsigned char RS_U8;
typedef struct
{
RS_U8 a:1; //bit 0
RS_U8 b:4; //bit 1 ~ bit 4
RS_U8 c:3; //bit 5 ~ bit 7
}RS_STRUCT_ABC;
typedef union
{
RS_STRUCT_ABC s;
RS_U8 data;
}RS_UNION_ABC;
int main()
{
RS_UNION_ABC test;
test.s.a=1;
test.s.b=2;
test.s.c=3;
printf("a=%d, b=%d, c=%d, data=0x%.2X\n",test.s.a, test.s.b, test.s.c, test.data);
return 0;
}
期望结果:
程序运行结果:a=1, b=2, c=3, data=0x65
举例告警:
typedef unsigned char RS_U8;
typedef struct
{
RS_U8 low_power:1; //bit 0 欠功率
RS_U8 over_power:1; //bit 1 过功率
RS_U8 c:1; //bit 2
RS_U8 d:1; //bit 3
RS_U8 e:1; //bit 4
RS_U8 f:1; //bit 5
RS_U8 g:1; //bit 6
RS_U8 h:1; //bit 7
}STRUCT_ALARM;
只需占一个节字,就可以完成8个告警数据,从而节省空间。
应用时也很简洁,比如:
STRUCT_ALARM PA_Alarm; //定义结构体
PA_Alarm.low_power=1; //告警赋值