C语言特殊结构体--位域(位段)的应用

4 篇文章 0 订阅
3 篇文章 0 订阅

我们通常把一个有某种关联的数据做成结构体,写程序时非常方便,也更有阅读性。有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关、使能、告警等,只用 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;        //告警赋值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值