“^=”运算符在这个查找非成对数算法中做了啥? [复制]

Posted

技术标签:

【中文标题】“^=”运算符在这个查找非成对数算法中做了啥? [复制]【英文标题】:What does the "^=" operator do in this find non-paired number algorithm? [duplicate]“^=”运算符在这个查找非成对数算法中做了什么? [复制] 【发布时间】:2017-10-25 04:08:00 【问题描述】:

看到一段有趣的代码,用于在重复数字列表中找到一个孤立的数字(列表中的每个数字都出现两次,除了一个)。

function findNonPaired(listOfNumbers) 
  let nonPairedNumber = 0

  listOfNumbers.forEach((n) => 
      nonPairedNumber ^= n
  )

  return nonPairedNumber


const x = [1,5,4,3,9,2,3,1,4,5,9]
console.log(findNonPaired(x))

这个解决方案看起来很优雅,但我很好奇 ^= 操作符实际上在这里做什么?

【问题讨论】:

@CumoloNimbus 那些是胡萝卜(不同的词)。请注意,^= 在 CSS 中也有含义,即match the beginning of an attribute。含义类似于正则表达式中的"start of string" anchor。您可以使用 document.querySelectorAll('[name^=form1-]') 将 CSS 的 ^= 应用于 javascript,它会查找所有具有以“form1-”开头的“name”属性的元素 附带说明,这个函数可以是单行的:findUnique = list => list.reduce((out, n) => out ^ n, 0) @CumoloNimbus Carets。胡萝卜是兔八哥喜欢的土里的东西。 您是否考虑过查阅参考手册? w3schools.com/js/js_assignment.asp 【参考方案1】:

a ^= ba = a ^ b 相同,其中^ 是按位异或运算符。

0 ^ 0 === 0
1 ^ 0 === 1
0 ^ 1 === 1
1 ^ 1 === 0

这是一个简洁的算法。让我们用[8, 12, 8] 列表跟踪一次执行,例如:

0 ^ 8 = 0000 ^ 1000 = 1000
        1000 ^ 1100 = 0100
        0100 ^ 1000 = 1100 = 12

“重复”一词不正确。该算法测试奇偶性。一个简单但有些错误的定义是“当一切都有一个”。对...平价。

[2,2,2,3,3,5,5,5,5] 将返回 2,因为其他所有内容都有一对。

[3,4,5] 实际上会返回 2 (011^100^101 -> 010),因为这是所有未配对项的异或。

【讨论】:

很酷的东西,感谢您的解释和示例 因此,该算法根本不“整洁”,因为它假装找到“唯一数字”,而在您的示例中 [2,2,2,3,3,5,5, 5,5] 它错误地找到 2 尽管 2 是三元组的一部分,因此不是唯一的,并且在您的 [3,4,5] 中找到 2,它甚至不在列表中,并且未能找到三个唯一的实际存在的数字。这是程序员可以“摆脱”的事情之一,直到这些条件不再适用,此时它会严重失败,正如您的上一个示例所展示的那样。 @MontyHarder 通常人们会在说“因此”之前先提出论据......另外感谢您对该算法的简洁性的意见。但是,它在此示例中正确地找到了 2,b/c 它是唯一未配对的数字。正如 JoeFrambach 所指出的,诚然“独特”对我来说是一个糟糕的词选择,而“非配对”将是一个更好的词选择 @MontyHarder 如果您不满足其先决条件,您可以对任何算法说同样的话。这个问题很清楚,它在一个数字列表上运行,其中每个数字出现两次,除了一个。虽然您肯定已经证明它在此之外不起作用,但这是一个稻草人的论点;没有人声称它会。 @MontyHarder 我的回答有没有说错?【参考方案2】:

就像其他答案所说 - 这是一个按位异或。

关于算法 - 如果您确定重复数是偶数,那就太酷了。当一个数字与x 进行异或运算,然后再次与x 进行异或运算时,它将返回到它的先前值。如果一个数字在该链中出现 3 次,则第 3 次出现将欺骗该算法。 此外,如果链中还有一个单独的值,例如:

a, b, c, X, a, c, b, Y

结果将是(X ^ Y),您无法确定是否有一个或多个唯一值。

【讨论】:

没有一个理智的人愿意继承这样的代码的责任,它没有记录假设(我们知道当我们 ASS|U|ME 时会发生什么)。

以上是关于“^=”运算符在这个查找非成对数算法中做了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

||= 在Ruby中做了啥[重复]

〜运算符在Python中做了啥[重复]

逗号运算符在“eval()”中做了啥?

(一元)* 运算符在这段 Ruby 代码中做了啥?

运算符 -i 在 `impala-shell -i localhost` 中做了啥

~~(“双波浪号”)在 Javascript 中做了啥?