你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

位域与联合体  

[复制链接]
freeelectron 发布时间:2017-1-15 00:54
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

联合体:在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

那么,我们可以把联合体
位域结合起来定义数据类型
例如下面:
union
{
    uint8_t  value;
    struct  
    {
        uint8_t  lowbit:2;
        uint8_t  middlebit:3;
        uint8_t  highbit:3;
    }byte;
}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.        
  3.         test_data2.byte.lowbit=3;
  4.         test_data2.byte.middlebit=3;
  5.         test_data2.byte.highbit=0;
  6.        
  7.   printf("lowbit=%d\r\n",test_data1.byte.lowbit);
  8.         printf("middlebit=%d\r\n",test_data1.byte.middlebit);
  9.         printf("highbit=%d\r\n",test_data1.byte.highbit);
  10.        
  11.         printf("test_data2.value=%d\r\n",test_data2.value);
复制代码
说明:test_data1中value直接赋值,打印看lowbit,middlebit,highbit各个位域的值;
         test_data2中lowbit,middlebit,highbit给各个位域赋值,打印查看value的值;

串口打印:
          位域与联合体的应用.png
从中也可以看出,是低位对齐。

stm32位域与联合体应用工程:
L1.rar (5.22 MB, 下载次数: 1055)

点评

很好的介绍了位的应用,尽管可以采用位与或位或的方法得到位值,但采用结构体定义更为简单,程序只要调用结构体定义的变量即可。超赞! 发表  发表于 2017-12-1 11:49

评分

参与人数 1 ST金币 +1 收起 理由
无薪税绵 + 1 赞一个!

查看全部评分

3 收藏 3 评论27 发布时间:2017-1-15 00:54

举报

27个回答
黑皮男 回答时间:2017-1-20 18:33:59
freeelectron 发表于 2017-1-17 23:09
帮忙投票,谢谢
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=610211#lastpost ...

已投票
斜阳__ 回答时间:2017-1-17 09:58:34
用于控制IO很方便,但是用的不多;stm32的RAM够大,采用单个位做标记的大部分可以使用一个字节代替,而且更方便更快;
ts2000 回答时间:2017-1-15 23:46:19
谢谢分享,,,好像太复杂了。。
peter001 回答时间:2017-1-16 00:29:41
介绍很好,有用
人之颠 回答时间:2017-1-16 08:48:08
这个很好用,有时候用的很方便
freeelectron 回答时间:2017-1-16 11:00:51
ts2000 发表于 2017-1-15 23:46
谢谢分享,,,好像太复杂了。。

一点都不复杂的
freeelectron 回答时间:2017-1-16 11:10:42
人之颠 发表于 2017-1-16 08:48
这个很好用,有时候用的很方便

是呀,节省空间,还省去了移位运算
Liryu 回答时间:2017-1-16 11:36:36
学习了,不过即使是用到了位域,它的汇编代码里还是要进行移位操作的吧?
freeelectron 回答时间:2017-1-16 12:01:00
Liryu 发表于 2017-1-16 11:36
学习了,不过即使是用到了位域,它的汇编代码里还是要进行移位操作的吧? ...

额,,,
freeelectron 回答时间:2017-1-17 11:08:19
斜阳__ 发表于 2017-1-17 09:58
用于控制IO很方便,但是用的不多;stm32的RAM够大,采用单个位做标记的大部分可以使用一个字节代替,而且更 ...

哦哦     
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版