union结构允许指定一个具有可变的比特数和单独地寻址一个更大的变量的每一个比特的能力。
union {
short value;
struct {
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
unsigned char bit8 : 1;
unsigned char bit9 : 1;
unsigned char bit10 : 1;
unsigned char bit11 : 1;
unsigned char bit12 : 1;
unsigned char bit13 : 1;
unsigned char bit14 : 1;
unsigned char bit15 : 1;
} bits;
} var;
现在你有一个名为var持有的16位整数,它可以通过var.value引用变量,你必须通过var.bits.bit15 acessing var.bits.bit0访问该变量的每个单独的位。
通过设置var.value = 0;所有位也被设置为0。通过设置var.bits.bit0 = 1;,您可以自动将var.value的值更改为0x8000,或者如二进制1000000000000000所示。
如果你的目的是改变只有最后3位,可以简化结构,以更多的东西是这样的:
union {
short value;
struct {
unsigned short header : 13;
unsigned char bit13 : 1;
unsigned char bit14 : 1;
unsigned char bit15 : 1;
} bits;
} var;
现在你有var.bits.header,这是一个13位的变量,而其他3 1位变量,你可以玩。
但是请注意C++不支持这种结构,所以为了获得最佳的C到C++可移植性,您可能更愿意使用bitwise operations,而不是像@nneonneo所建议的那样。