我得到了
uint32_t bits = 0;
bits |= 1<< 31;
bits |= 1<< 15;
bits |= 1<< 14;
bits |= 1<< 13;
这给了我10000000000000001110000000000000
在另一个函数中*(bits) |= 0 << 15;
但它没有做任何事情,它应该将第16个1更改为0,所以应该会出现以下情况:10000000000000000110000000000000
任何帮助?
答案 0 :(得分:5)
将位更改为0的正确方法是and
否定,例如
bits &= ~(1 << 15);
答案 1 :(得分:1)
你必须这样做:
bits &= ~(1 << 15)
答案 2 :(得分:1)
通过与补码进行AND运算来完成清除,即:
*(bits) &= ~(1 << 15);
(1 << 15)
生成一个数字,第15位设置为1
:
00000000000000001000000000000000
然后按位NOT运算符将其反转并产生一个除第15位以外的所有数字:
11111111111111110111111111111111
当你将这个数字与原始数字相加时,位置15的位被清除:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&
11111111111111110111111111111111
================================
XXXXXXXXXXXXXXXX0XXXXXXXXXXXXXXX
其中X标记原始位。