首页 > 解决方案 > 联合的位字段用法

问题描述

我想使用联合创建一个带有位字段的简单包。但是当我尝试将“bit1”设置为 1 时,我的所有位字段都变为“1”。我该如何解决这个问题,我想通过使用联合而不是使用结构来完成位字段部分。

所以这里是我的结构;

    struct {
    union{
        uint8_t bit1 :1 ;
        uint8_t bit2 :1 ;
        uint8_t bit3 :1 ;
        uint8_t bit4 :1 ;
        uint8_t bit5 :1 ;
        uint8_t bit6 :1 ;
        uint8_t bit7 :1 ;
        uint8_t bit8 :1 ;


    }bits;
    uint8_t trial;


    }myStruct_t;

int main(int argc, char *argv[]) {
        myStruct_t.bits.bit1 = 1;
        myStruct_t.bits.bit2 = 0;
        printf("%x",myStruct_t.bits);
        printf("%x",myStruct_t.bits.bit1);
        printf("%x",myStruct_t.bits.bit2);

    return 0;
}

输出为:000。

标签: cbit-manipulation

解决方案


union用你的交换你的struct

即我相信你想要一个结构和一个int的联合,而不是一个联合和一个int的结构。(我保留了现在具有误导性的名称myStruct_t,可能myUnion_t现在应该是。)

#include <stdio.h>
#include <stdint.h>

union
{
    struct
    {
        uint8_t bit1 :1 ;
        uint8_t bit2 :1 ;
        uint8_t bit3 :1 ;
        uint8_t bit4 :1 ;
        uint8_t bit5 :1 ;
        uint8_t bit6 :1 ;
        uint8_t bit7 :1 ;
        uint8_t bit8 :1 ;
    }bits;
    uint8_t trial;
}myStruct_t;

int main(int argc, char *argv[])
{
    myStruct_t.trial=0; // use the encompassing union member for init
    myStruct_t.bits.bit1 = 1; // now use the bitwise view to set bits
    myStruct_t.bits.bit2 = 0;
    printf("%x",myStruct_t.trial);
    printf("%x",myStruct_t.bits.bit1);
    printf("%x",myStruct_t.bits.bit2);

    return 0;
}

我得到的输出是 110,你可能会看到 12810。除了缺少换行符,这会有所帮助,这意味着:

  • 包含的 8 位视图的值为 1,至少在我的环境的字节序中 - 你可能会看到 128
  • 位 1 的值为 1
  • 位 2 的值为 0

推荐阅读