我不明白这次XOR会发生什么

时间:2016-11-26 16:53:56

标签: javascript xor

我正在解决这个问题。 "给定一个数组,找到出现奇数次数的int。 总会有一个整数出现奇数次。" 我在网上提出了这个解决方案:

function findOdd(A) {
var n = 0;
  for(var i = 0; i < A.length; i++){
  n = n^A[i];
  }

  return n;
}

这有效,但我不知道为什么,我希望有人可以向我解释。我只是不理解这句话:

n = n^A[i];

你可以告诉我在这种情况下它在做什么吗?

4 个答案:

答案 0 :(得分:2)

对任何数字进行Xoring将导致0.如果您知道只有一个数字出现奇数次,其他数字将通过自我xored取消,答案将是出现的剩余数字奇数次。

答案 1 :(得分:1)

按位运算符处理32位数。操作中的任何数字操作数都将转换为32位数。结果将转换回JavaScript编号。 ^是一个按位XOR javascript运算符。

按位异或运算符在每个位的位置返回一个,其中任一个但不是两个操作数的相应位都是1。

如果a和b不同,则XOR b产生1。 XOR操作的真值表是:

a   b       a XOR b

0   0         0
0   1         1
1   0         1
1   1         0

表达式n = n^A[i];

的说明

A = [1,2,3,4,5]

for n=0, i=0 =&gt; 0 ^ A[0] =&gt; 0 ^ 1 =&gt;转换为二进制0000 ^ 0001结果为0001,等于1

for n=1, i=1 =&gt; 1 ^ A[1] =&gt; 1 ^ 1 =&gt;转换为二进制1111 ^ 0010结果为1101,等于13

依此类推......希望这个解决方案可以帮助您理解上述表达并清除您的所有疑虑。

答案 2 :(得分:0)

^是一个exor位智能运算符。所以当你这样做时

  • 1 ^ 1是0

  • 0 ^ 1是1

  • 1 ^ 0是1
  • 0 ^ 0为0

所以要找到以下代码所用的奇数1 最初的结果是arr [0]为1。 所以在arrary 0 ^ 0变为0而2 ^ 2变为0并且有3 1&#39; s所以1 ^ 1变为0并且0 ^ 1我们被遗漏了重复奇数nubmer次数

&#13;
&#13;
var arr=[1,1,1,0,0,2,2];
var result=arr[0];
for(var i=1;i<arr.length;i++)
  result=result ^ arr[i];

console.log(result);
  
&#13;
&#13;
&#13;

希望有所帮助

答案 3 :(得分:0)

两个相同数字的XOR始终为零。也就是说,

imageViews.forEach { $0.isUserInteractionEnabled = true }

因此,如果您对某个特定数字反复偶数次偶数,则结果将为零。

这里,最初n的值为零。即使次数被异或的次数也将为零。并且出现奇数次数的数字,比如说A^A=0次,对于2m次出现将导致零,并且对于最后一次出现将导致相同的数字。

这就是解决方案的工作原理。