欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 23:15:44
...

1、位域

详细介绍参考文章:位域

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

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

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

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

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

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

2、联合体

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

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

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

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

3、示例

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) 位域定义部分

union 
{
        uint8_t  value;
        struct  
        {
                uint8_t  lowbit:2;
                uint8_t  middlebit:3;
                uint8_t  highbit:3;
        }byte;
}test_data1,test_data2;

2) 赋值、打印说明

test_data1.value=15;

test_data2.byte.lowbit=3;
test_data2.byte.middlebit=3;
test_data2.byte.highbit=0;

printf("lowbit=%d\r\n",test_data1.byte.lowbit);
printf("middlebit=%d\r\n",test_data1.byte.middlebit);
printf("highbit=%d\r\n",test_data1.byte.highbit);

printf("test_data2.value=%d\r\n",test_data2.value);

说明:

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

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