数学表示:
a ^ a ^ b = b;
a ^ b ^ a = b;
b ^ a ^ a = b;
原理:
可用穷举法证明:
异或运算:1 ^ 1 = 0;1 ^ 0 = 1; 0 ^ 1 = 1; 0 ^ 0 = 0;
穷举:
1 ^ 1 ^ 1 = 1;
1 ^ 1 ^ 0 = 0;
1 ^ 0 ^ 1 = 0;
0 ^ 1 ^ 1 = 0;
1 ^ 0 ^ 0 = 1;
0 ^ 1 ^ 0 = 1;
0 ^ 0 ^ 1 = 1;
0 ^ 0 ^ 0 = 0;
可知任意1或0出现两次,即可抵消。
从而推广至多个位(bit)。
一个数异或同一个数两次,结果还是那个数。 且异或的顺序可变。
————————————————
版权声明:本文为CSDN博主「Wilson_act」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wilsonact/article/details/87075380
如何证明这个结论呢?
观察xor的运算, 我们可以得出一个结论, 其实xor相当于不进位的加法。
举个例子:
num1: .byte 0b0
num2: .byte 0b1
情况1
xorb 0, num1 #结果 num1 = 0b0 相当于 0 + 0 = 0
xorb 1,num1 #结果 num1 = 0b1 相当于 1 + 0 = 1
情况2
xorb 0, num2 #结果 num2 = 0b1 相当于 0 + 1 = 1
xorb 1,num2 #结果 num2 = 0b0 相当于 1 + 1 = 0b10, 进位被直接舍弃, 最后num2 = 0b0
所以上述 a xor b xor b == a, 可以先理解成 a + b + b == a 这个等式
假如 a 和 b 就是单纯的 一个bit位
那么在这两次的连加中, 不管有没有进位,最后连加的结果的最低位一定等于a (这其中b是可以 == a的)
这是二进制加法的特性,但是要注意的是连加的次数一定要是2的倍数,而且连加的被加数b一定要不变 (这其中b是可以 == a的)
有了这个特性我们回过头去看xor
上面说了xor相当于不进位的加法,所以 a+b+b 最后计算的结果所有的进位全被舍弃,自然而然保留的结果一定 == a
现在将a和b括展到多个bit位,那么原理是一样的, a xor b xor b, 还是相当于 a + b + b, xor会将每个对应的 bit位 都做 连续的加法,由于是不进位的,所以每次对应的bit位的连加是互不影响的,所以最后整个结果 所有的二进制bit位都相没有变, 所以最后的结果一定是a
xor上述这样的运算特性,可以做一些简单的加密
作者:聽歌的大肥豬
链接:https://www.jianshu.com/p/0027bb0cfdec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。