C 带并集的位字段用法
我想使用union创建一个带有位字段的简单包。 但当我试图将“bit1”设置为1时,所有的位字段都变成了“1”。如何解决这个问题,我想使用union而不是struct来完成位字段部分 所以这里是我的结构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
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
\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;
}