6

所以我有一个 16 位的数字。假设它的变量名是 Bits。我想让 Bits[2:0] = 001、100 和 000,而无需更改任何其他内容。我不知道该怎么做,因为我能想到的只是将我想成为 1 的位与 1 进行或运算,但我不确定如何清除其他位以使它们为 0。如果有人有建议,我将不胜感激。谢谢!

4

2 回答 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.bit0var.bits.bit15

通过设置var.value = 0;所有位也设置为 0。通过设置var.bits.bit0 = 1;,您可以自动将 的值更改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.header13 位变量和 3 个其他 1 位变量,您可以使用它。

但请注意 C++ 不支持这种结构,因此为了获得最佳的 C 到 C++ 的可移植性,您可能更喜欢使用按位运算,而不是 @nneonneo 提出的建议。

于 2013-04-10T01:19:07.843 回答