C改变了一点uint32_t无法正常工作

时间:2013-11-15 13:24:00

标签: c sign bits uint32-t

我得到了

uint32_t bits = 0;

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

这给了我10000000000000001110000000000000

在另一个函数中*(bits) |= 0 << 15;但它没有做任何事情,它应该将第16个1更改为0,所以应该会出现以下情况:10000000000000000110000000000000

任何帮助?

3 个答案:

答案 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标记原始位。