一般用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测试结果如下,结论正确: