联合体加结构体的应用

    因为最近设计到通讯协议。而通讯协议中为了减少数据量,常常用一个字节的八个位分别代表八种不同的状态。这就涉及到位的操作和分解。过程可能比较麻烦而且如果位数多的表示可能不是很明了,(比如我一个字节的前三个字节表示状态,后面的分别一个字节表示其他情况)。所以这边利用了联合体和结构体的综合应用。用一个结构体来表示位操作,比如我定义一个8位的操作

typedef union

{

    unsigned char sum;

    struct {

        unsigned char bit1:1;

        unsigned char bit2:1;

        unsigned char bit3:1;

        unsigned char bit4:1;

        unsigned char bit5:4;

    }bit;

)struct_bit;


上面的结构体,就表示将一个字节八位分别拿出来表示你要将其中的几个位怎么应用。切记,一定是无符号类型的。如果有符号。则会出错。冒号后面的数字表示这个位占用了几个字节。在GCC的编译下,如果你赋值的位太大,则编译不通过会报错。比如你定义了这么一个变量。struct_bit temp,然后这样赋值 temp.bit.bit1 = 2; 这样就会出错。因为bit1只分配了一位。而2则要用两位表示。还有一点就是,字节的大小端问题。小弟这边用的是小端模式。所以高字节放在高地址处。所以bit1表示第0位,bit5表示高四位。如果你这样赋值:

    temp.bit.bit1 = 1;

    temp.bit.bit2 = 0;

    temp.bit.bit3 = 0;

    temp.bit.bit4 = 1;

    temp.bit.bit5 = 5;


则temp.sum = 89。化为二进制为01011001;


虽然是个简单的东西。不过,在一些通讯协议中的话,还是很好用的,希望能帮到有需要的人。

猜你喜欢

转载自blog.csdn.net/jutun5887/article/details/80221137