Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带并集的位字段用法_C_Bit Manipulation - Fatal编程技术网

C 带并集的位字段用法

C 带并集的位字段用法,c,bit-manipulation,C,Bit Manipulation,我想使用union创建一个带有位字段的简单包。 但当我试图将“bit1”设置为1时,所有的位字段都变成了“1”。如何解决这个问题,我想使用union而不是struct来完成位字段部分 所以这里是我的结构 struct { union{ uint8_t bit1 :1 ; uint8_t bit2 :1 ; uint8_t bit3 :1 ; uint8_t bit4 :1 ; uint8_t bit5

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

所以这里是我的结构

    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。

联合
结构
交换

我相信你想要的是一个结构和一个整数的并集,而不是一个并集和一个整数的结构。 (我保留了现在令人误解的名字
myStruct\t
,现在可能应该是
myUnion\t

#包括
#包括
联盟
{
结构
{
uint8_t比特1:1;
uint8_t比特2:1;
uint8_t比特3:1;
uint8_t比特4:1;
uint8第5位:1;
uint8_t比特6:1;
uint8第7位:1;
uint8_t比特8:1;
}比特;
uint8试验;
}我的结构;
int main(int argc,char*argv[])
{
myStruct\u t.trial=0;//将包含的联合成员用于init
myStruct\u t.bits.bit1=1;//现在使用按位视图设置位
myStruct_t.bits.bit2=0;
printf(“%x”,我的结构试验);
printf(“%x”,myStruct\u t.bits.bit1);
printf(“%x”,myStruct\u t.bits.bit2);
返回0;
}
我得到的输出是110,你可能会看到12810。除了缺少新词(这会有所帮助)之外,它意味着:

  • 包含的8位视图的值为1,至少与我的环境的Endianness相同-您可能会看到128
  • 位1的值为1
  • 位2的值为0

这就是工会。所有成员使用相同的内存。为什么你认为你需要一个联合体而不是结构体?请大家。这既不是打字错误,也不可复制(MRE问题除外)。这是对复合数据类型层次结构的误解,需要一些解释,例如,以反建议的形式实现OP显然正在尝试的目标。(是的,我有一个答案。是的,我想保存它。我承认。)顺便说一句,不管是union还是struct,您的
\u 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;
}