交换数组,排序proramm

时间:2015-08-08 16:33:21

标签: java sorting

我在wiki页面中有关于排序的代码安静。 我想它必须交换到数组元素,但有人可以正确地解释它

   array[i] ^= array[i-1];
   array[i-1] ^= array[i];
   array[i] ^= array[i-1];

wiki页面https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC

1 个答案:

答案 0 :(得分:3)

这是一种交换array [i]和array [i-1]的方法。

^ =在两个参数之间进行按位异或并将其分配给左边的参数 要查看导致交换的原因,我们只考虑一对位:A和B,它们分别包含值x和y。

  • 开始之前我们有:
    A = x
    B = y
  • 第一条指令A ^ = B表示A =(A XOR B)所以我们最终得到:
    A = x XOR y
    B = y
  • 第二条指令B ^ = A表示B =(B XOR A)所以我们最终得到:
    A = x XOR y
    B = y XOR(x XOR y)
  • 第三条指令A ^ = B表示A =(A XOR B)所以我们最终得到:
    A =(x XOR y)XOR(y XOR(x XOR y))
    B = y XOR(x XOR y)
  • 利用XOR的相关性和交换性,我们可以将之前的操作重新排序为:
    A =(x XOR x)XOR(y XOR y)XOR y
    B =(y XOR y)XOR x
  • 利用XOR本身始终为0的属性:
    A = 0 XOR 0 XOR y
    B = 0 XOR x
  • 使用0 XOR位的属性总是相同的位:
    A = y
    B = x

如您所见,A和B已被交换。