C语言利用共用体实现位操作

一般用C语言位操作都是直接用‘&’,‘|’等位操作计算符来实现位操作,不过有的时候就是想玩点花的。

先定义一个共用体,内部定义一个16位的变量,内部再定义一个结构体。

共用体实现位操作的关键就在于这个内部的结构体,首先明确一个知识,就是结构体内存中是连续的,但是不需要是一个完整的字节,因此定义内部定义16个一bit的位域,例如:u8 bit0 : 1;,最后该共用体的定义如下:

typedef union Test_UnionBit
{
    u16   Test_u16;
    struct
    {
        u8 bit0  : 1;
        u8 bit1  : 1;
        u8 bit2  : 1;
        u8 bit3  : 1;
        u8 bit4  : 1;
        u8 bit5  : 1;
        u8 bit6  : 1;
        u8 bit7  : 1;
        u8 bit8  : 1;
        u8 bit9  : 1;
        u8 bit10 : 1;
        u8 bit11 : 1;
        u8 bit12 : 1;
        u8 bit13 : 1;
        u8 bit14 : 1;
        u8 bit15 : 1;
    }Bits;
};

这样定义了这个共用体后,由于Test_u16变量和Bits结构体共用体一个内存空间,因此对Bits的成员变量操作,也就是一个位的操作,就能同时对Test_u16的对应位操作,也就实现了对Test_u16进行位操作。

定义好共用体后具体操作方法如下:

1.先定义一个共用体变量:

union Test_UnionBit Onebitu16;

2.利用宏定义记录对应位的意义,比如第16位为X轴电机开关:

#define X_Motor bit15

3.之后再使用只需:

Onebitu16.Bits.X_Motor =1;

这样就实现了位操作。

将最高位改为1,其余为0,相当于十进制的32768,用VS2019测试结果如下,结论正确:

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中的共用体(Union)和位域(Bit-Field)是用来优化内存使用和灵活操作数据的工具。 共用体是一种特殊的数据类型,它允许不同的变量共享同一块内存空间。共用体中的成员变量共享同一内存,占用内存大小等于最大成员的大小。通过修改共用体的一个成员变量的值,可以影响到其他成员变量的值。共用体适用于在不同的数据类型之间进行转换或者存储占用内存大小不定的数据。 位域是一种特殊的结构体成员变量,可以指定成员变量占用的位数,从而实现对内存空间的灵活利用。位域的成员变量必须是整型数据类型,并且位域的大小不能超过该整型类型的大小。位域可以用于减小数据结构占用的内存大小,以及进行数据的位操作共用体和位域结构体可以一起使用。通过在位域结构体中定义共用体成员变量,可以实现对内存的灵活使用和数据的高效操作共用体可以用于存储不同类型的数据,而位域可以用于压缩数据的存储空间。这种结合使用的方式可以为我们的程序带来更加高效和节省内存的特点。 总结起来,C语言中的共用体和位域结构体提供了一种优化内存使用和操作数据的方式。它们可以灵活地对内存空间进行利用,并且能够高效地操作数据。通过合理的使用共用体和位域结构体,我们可以达到节省内存和提高程序执行效率的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮会跳

做硬件烧钱,感谢支援

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值