我正在编写一个程序,它将位置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>
那为什么不工作呢?
答案 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
,否则为0111
或OR
。
出于同样的原因,您可以1000
使用XOR
将其设置为1。
使用1000
切换{{1}}。