在C中更改int中的位?

时间:2013-04-10 01:00:13

标签: c int bit

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

2 个答案:

答案 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提议的那样。