所以我有一个16位数字。假设它的变量名是Bits。我想让Bits [2:0] = 001,100和000,而不改变其他任何东西。我不知道该怎么做,因为我能想到的是ORing我希望与1成为1的位,但我不知道如何清除其他位以使它们为0。如果有人有建议,我很感激。谢谢!
答案 0 :(得分:6)
使用要清除的位的倒数清除某些位&
。然后你可以在你需要的位中|
。
在这种情况下,您希望将低三位(二进制111
或十进制7
)归零,因此我们&
与~7
清除那些位。
Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001
答案 1 :(得分:2)
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.bit0
来访问这个变量的每个位。通过var.bits.bit15
。
通过设置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 to C ++可移植性,您可能更愿意使用bitwise operations而不是@nneonneo提议的那样。