所以我有一个 16 位的数字。假设它的变量名是 Bits。我想让 Bits[2:0] = 001、100 和 000,而无需更改任何其他内容。我不知道该怎么做,因为我能想到的只是将我想成为 1 的位与 1 进行或运算,但我不确定如何清除其他位以使它们为 0。如果有人有建议,我将不胜感激。谢谢!
问问题
9081 次
2 回答
7
清除某些位,&
与要清除的位相反。然后你可以|
在你想要的位。
在这种情况下,您希望将低三位(111
二进制或7
十进制)清零,因此我们&
要~7
清除这些位。
Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001
于 2013-04-10T01:04:49.317 回答
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 到 C++ 的可移植性,您可能更喜欢使用按位运算,而不是 @nneonneo 提出的建议。
于 2013-04-10T01:19:07.843 回答