我正在尝试定义一个允许直接设置字节值的结构,并且还允许在不使用bit_set(),bit_clear()等函数的情况下操作字节的位。 这是我的定义
typedef union FLAG_WORK {
volatile unsigned char BYTE;
struct {
volatile unsigned char bit0:1;
volatile unsigned char bit1:1;
volatile unsigned char bit2:1;
volatile unsigned char bit3:1;
volatile unsigned char bit4:1;
volatile unsigned char bit5:1;
volatile unsigned char bit6:1;
volatile unsigned char bit7:1;
}BIT;
}FLAG8;
和示例代码
int main()
{
FLAG8 i;
i.BYTE=(unsigned char)0; // initial the value of i.BYTE
i.BIT.bit0 = 1; // set bit0 of i.BYTE
i.BIT.bit1 = 1;
cout << (int)i.BYTE << endl;
cout << "Hello world!" << endl;
return 0;
}
我只是想知道如何修改结构,允许我直接在上面的代码中为“i”赋值? 有什么建议吗?
答案 0 :(得分:4)
C99允许明确初始化成员。假设我正确理解你的问题,你正在寻找
FLAG8 i = { .BIT = { .bit2 = 1, .bit5 = 1 } };
FLAG8 j = { .BYTE = 42 };
FLAG8 k = { 42 }; // same as j as initializing the first member is default
答案 1 :(得分:2)
正常情况下,您可以分配类似但值重叠,因为此处union仅保存1个字节的内存
FLAG8 i = { .BIT = { .bit2 = 1, .bit5 = 1 } , .BYTE = 42};
//result of i.BYTE is 42 depens on Byte value
FLAG8 i = { .BYTE = 42 , .BIT = { .bit2 = 1, .bit5 = 1 } };
//result of i.BYTE is 36 depends on bits values
1.如@Christoph所建议您可以直接指定值BYTE或逐位指定
FLAG8 i = { .BYTE = 42 };
FLAG8 j = { .BIT = { .bit2 = 1, .bit5 = 1 } };
printf("%d \n\n",(int)i.BYTE );
printf("%d \n\n",(int)j.BYTE );
2.您可以逐位分配值
i.BIT.bit0 = 1; // set bit0 of i.BYTE
i.BIT.bit1 = 1;
i.BIT.bit4 = 1;
printf("%d \n\n",(int)i.BYTE );
3.您可以直接指定带有十六进制值的BYTE
i.BYTE=0x10;
printf("%d \n\n",(int)i.BYTE );
4.您可以直接指定带小数值的BYTE
i.BYTE=100;
printf("%d \n\n",(int)j.BYTE );
5.您可以直接指定相同类型的标识符
j.BYTE=0x30;
printf("%d \n\n",(int)j.BYTE );
i=j;
printf("%d \n\n",(int)i.BYTE );
6.分配十进制值并在打印十进制和十六进制格式时检查它
j.BYTE=100;
printf("%d \n\n",(int)j.BYTE );
printf("%x \n\n",(int)j.BYTE );
j.BIT.bit4=0;
j.BIT.bit5=0;
printf("%d \n\n",(int)j.BYTE );
printf("%x \n\n",(int)j.BYTE );