在C中更改int中的位?

所以我有一个16位数。 假设它的变量名是Bits。 我想让Bits [2:0] = 001,100和000,而不改变其他任何东西。 我不知道该怎么做,因为我能想到的是ORing我希望与1成为1的位,但我不确定如何清除其他位以使它们为0.如果有人有建议,我很感激。 谢谢!

要清除某些位, &使用要清除的位的反转。 然后你可以| 在你想要的位。

在这种情况下,您希望将低三位(二进制为111或十进制为7 )归零,因此我们用~7来清除这些位。

 Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001 

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的变量,它包含一个可以由var.value引用的16位整数,并且你可以通过访问var.bits.bit0var.bits.bit15来访问这个变量的每个单独的位。

通过设置var.value = 0; 所有位也设置为0。 通过设置var.bits.bit0 = 1; 您自动将var.value的值var.value0x8000 ,或者如二进制中所示, 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 ++可移植性,您可能更喜欢使用@nneonneo提出的按位运算 。