2

我有

uint32_t bits = 0;

bits |= 1<< 31;
bits |= 1<< 15;
bits |= 1<< 14;
bits |= 1<< 13;

这给了我 100000000000000001110000000000000

在我做的另一个函数中,*(bits) |= 0 << 15;但它什么也没做,它应该将第 16 个 1 更改为 0,因此应该出现以下内容:10000000000000000110000000000000

有什么帮助吗?

4

3 回答 3

5

将位更​​改为 0 的正确方法是and取反,例如

bits &= ~(1 << 15);
于 2013-11-15T13:26:39.250 回答
1

你所要做的:

bits &= ~(1 << 15)
于 2013-11-15T13:27:47.380 回答
1

清除位是通过与补码进行与运算来完成的,即:

*(bits) &= ~(1 << 15);

(1 << 15)产生一个第 15 位设置为的数字1

00000000000000001000000000000000

然后按位 NOT 运算符将其反转并产生一个除第 15 位外全为 1 的数字:

11111111111111110111111111111111

当您将此数字与原始数字相加时,位置 15 中的位将被清除:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
               &
11111111111111110111111111111111
================================
XXXXXXXXXXXXXXXX0XXXXXXXXXXXXXXX

其中 X 标记原始位。

于 2013-11-15T13:27:49.647 回答