前言
学习 java 时无意间发现的一个不需要第三个变量实现两数交换的神奇操作
操作
- x = x ^ y;
- y = x ^ y;
- x = x ^ y;
原理
异或
- 0 ^ 0 = 0;
- 0 ^ 1 = 1;
- 1 ^ 0 = 1;
- 1 ^ 1 = 0;
总结起来就是相同取 0 ,不同取 1
假设:
x = 13, x 的二进制数为 1101;
y = 15, x 的二进制数为 1111;
对于 x 和 y 的二进制数来说,只有中间的一个数有差异,只需要改变中间这一个数即可
第一次异或:x = x ^ y;
x = x ^ y = 0010;
此时,异或的结果表示了原来的 x 和 y 的有所差异的值
第二次异或:y = x ^ y;
y = x ^ y = 1101;
x 此时是一个差异值,y 此时还是原值
如果 x 的位数是 0,则代表 x 的原值和 y 的这位的位数是一样的,不需要更改
如果 x 的位数是 1,则代表 x 的原值和 y 的这位的位数不一样的,需要更改
通过一次异或操作,把原来相同的位数保留,不相同的位数取反,此时 y 的值变成了 x 的原值
第三次异或:x = x ^ y;
x = x ^ y = 1111;
同理,x 仍然是一个差异值,y 此时是 x 的原值
通过异或操作,保留相同的位数,不相同的位数取反,x 变成了 y
本质
通过异或操作得到两数的二进制数中不同的位数,将其各自取反,相同的位数则保留