我有
uint32_t bits = 0;
bits |= 1<< 31;
bits |= 1<< 15;
bits |= 1<< 14;
bits |= 1<< 13;
这给了我 100000000000000001110000000000000
在我做的另一个函数中,*(bits) |= 0 << 15;
但它什么也没做,它应该将第 16 个 1 更改为 0,因此应该出现以下内容:10000000000000000110000000000000
有什么帮助吗?
将位更改为 0 的正确方法是and
取反,例如
bits &= ~(1 << 15);
你所要做的:
bits &= ~(1 << 15)
清除位是通过与补码进行与运算来完成的,即:
*(bits) &= ~(1 << 15);
(1 << 15)
产生一个第 15 位设置为的数字1
:
00000000000000001000000000000000
然后按位 NOT 运算符将其反转并产生一个除第 15 位外全为 1 的数字:
11111111111111110111111111111111
当您将此数字与原始数字相加时,位置 15 中的位将被清除:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&
11111111111111110111111111111111
================================
XXXXXXXXXXXXXXXX0XXXXXXXXXXXXXXX
其中 X 标记原始位。