【IoT】STM32 位域与联合体结合优化操作

举报
产品人卫朋 发表于 2021/10/30 00:37:53 2021/10/30
【摘要】 1、位域 详细介绍参考文章:位域 位域可以实现在信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。 例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几 个不同的...

1、位域

详细介绍参考文章:位域

位域可以实现在信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。

例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。

为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。

所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。

每个域有一个域名,允许在程序中按域名进行操作。 

这样就可以把几个不同的对象用一个字节的二进制位域来表示。

2、联合体

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。

也就是使用覆盖技术,几个变量互相覆盖。

这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

可以把联合体和位域结合起来定义数据类型。

3、示例


  
  1. union 
  2. {
  3.     uint8_t  value;
  4.     struct  
  5.     {
  6.         uint8_t  lowbit:2;
  7.         uint8_t  middlebit:3;
  8.         uint8_t  highbit:3;
  9.     }byte;
  10. }test_data;

说明:

可以看出value和byte共用一个字节的内存空间,改变value的值,那么byte的值也就改变了,同样改变byte中的位(lowbit占两位, middlebit占3位,highbit也占3位;)value的值也就改变了;

一般情况下,我们要得到value中的高三位的值,需要得到这样(暂定高三位的值为x)x=(value>>5)&0x03,但是使用了位域,就可以直接得到了,省去了这样的一个计算的过程,当然位域的好处不止这些,需要大家灵活运用。

示例说明:

1) 位域定义部分


  
  1. union 
  2. {
  3.         uint8_t  value;
  4.         struct  
  5.         {
  6.                 uint8_t  lowbit:2;
  7.                 uint8_t  middlebit:3;
  8.                 uint8_t  highbit:3;
  9.         }byte;
  10. }test_data1,test_data2;

2) 赋值、打印说明


  
  1. test_data1.value=15;
  2. test_data2.byte.lowbit=3;
  3. test_data2.byte.middlebit=3;
  4. test_data2.byte.highbit=0;
  5. printf("lowbit=%d\r\n",test_data1.byte.lowbit);
  6. printf("middlebit=%d\r\n",test_data1.byte.middlebit);
  7. printf("highbit=%d\r\n",test_data1.byte.highbit);
  8. printf("test_data2.value=%d\r\n",test_data2.value);

说明:

test_data1中value直接赋值,打印看lowbit,middlebit,highbit各个位域的值;

test_data2中lowbit,middlebit,highbit给各个位域赋值,打印查看value的值。
         
         
         
         

文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/liwei16611/article/details/88812245

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。