“^=”运算符在这个查找非成对数算法中做了啥? [复制]
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 ^= b
与a = 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 时会发生什么)。以上是关于“^=”运算符在这个查找非成对数算法中做了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章