例:
x=4 = 0100(二进制)
y=5 = 0101(二进制)
x^y = 1=0001(二进制)
异或解释:
对于两个二进制数字 x 和 y ,若 x 和 y 在某一位上相同(都为0或都为1),则它们的按位异或结果该位为0; 如若不同,即 x 和 y 在该位上一个为0,另一个为1,则它们的按位异或结果该位为1
我们可以利用上述特性来实现按位异或的操作,具体来说:
一.将x和y进行与(&)操作结果位0100
二.
将一的结果进行非(~)操作1011
A.对x进行按位非(~)操作, ~x(1011)
B.对y进行按位非(~)操作, ~y(1010)
C.将上述A.和B.的结果进行按位与(&)操作, (~x & ~y)(1010)
D.对C.的结果进行非(~)操作, ~( ~x& ~y)(0101)
三.将二中A.(1011)和D.(1010)的结果进行与(&)操作,得到0001
这时我们发现三中的结果就变成x和y直接进行异或的结果了!!!
接下来这些操作进行逐一解释:
在上面的操作中可以看到我们对最初的x和y的不同位(既第0位)进行了标记,仔细观察一.和C.中的结果,我们发现前三位中的每一位都是不同的,但是第0位是相同的。
这是因为我们在第一部分先对x和y进行&操作,在第二部分我们对一的结果先~在&,因为&操作不影响二进制的不同位的结果,所以1.和a.的结果只有前三位不相同,这样我们在1.和c.的结果上进行 ~ 操作这样不同位我们就都变为1了!而前三位还是不相同!!,于是在A这一步的结果下就实现了对x和y的异或操作!!
总的来讲我们要关心哪些位不相同,将都不相同的位置操作为1,相同的位置改为不相同,这样&之后得到的结果就是a和b的按位异或。
int xor(int a, int b) {
return ~(~a & ~b) & ~(a & b);
}