为什么“number&amp;(〜(1 <&lt; 3))”对0不起作用?

时间:2014-02-20 11:28:50

标签: bit-manipulation bitwise-operators

我正在编写一个程序,它将位置3,4和5上的位值与给定32位无符号整数的位置24,25和26进行交换。

所以我想说我使用数字15而我想把第4位变成0,我会用......

int number = 15
int newnumber = number & (~(1 << 3));
// output is 7

这是有道理的,因为我将第4位从1交换为0,因此15(1111)变为7(0111)。

然而,这不会反过来工作(将0更改为1),现在我知道如何通过不同的方法实现0到1的交换,但我真的想要理解这种方法中的代码。 / p>

那为什么不工作呢?

2 个答案:

答案 0 :(得分:2)

x AND y的真值表是:

x y  Output
-----------
0 0    0
0 1    0
1 0    0
1 1    1

换句话说,如果两个输入均为1,则输出/结果将仅为1,这意味着您不能通过按位AND将位从0更改为1。使用按位OR(例如int newnumber = number | (1 << 3);

总结:
使用& ~(1 << n)清除位n 使用| (1 << n)设置位n

答案 1 :(得分:1)

要将第四位设置为0,AND~(1 << 3)设为1000,否则为0111OR

出于同样的原因,您可以1000使用XOR将其设置为1。

使用1000切换{{1}}。