【问题标题】:Swap in array, sorting proramm [duplicate]交换数组,排序proramm [重复]
【发布时间】:2015-10-31 23:40:03
【问题描述】:

我在关于排序的 wiki 页面中有这种平静的代码。 我想它必须交换为数组元素,但有人可以正确解释一下

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

维基页面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

【问题讨论】:

标签: java sorting


【解决方案1】:

这是一种交换数组[i] 和数组[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 已交换。

【讨论】:

  • 如果您引用文本,您还应该包括来源。
  • 我不是,我自己写的。虽然是的,但搜索并复制过去可能会更快。
  • 很抱歉造成混乱。我通常看不到格式正确的答案,当我看到时,它们通常是某些文章部分的副本。无论如何很好的答案。 +1。
  • 你不这么认为!我犯了许多格式错误,不得不多次编辑以更正它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多