三次异或操作实现两数的交换

干货分享 / 2021-11-07

前言

学习 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

本质

通过异或操作得到两数的二进制数中不同的位数,将其各自取反,相同的位数则保留