2016-11-26 73 views
1

我正在处理这个问题。 “给定一个数组,找到出现奇数次的int。 总是只有一个整数出现奇数次。” 我想出了这个解决方案在线:我不明白这个XOR发生了什么

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

    return n; 
} 

这工作,但我不知道为什么,我希望有人能向我解释。我只是不明白这一行:

n = n^A[i]; 

请问在这种情况下它是干什么的?

+1

你在问XOR有什么功能吗?否则,'A'的内容到底是什么? – Taplar

回答

2

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

+1

这应该被标记为答案 – Gravity

+1

而xoring 0与任何int都是int。 xor是关联和交换的。 QED。 – Oriol

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的所以1^1得到0℃,用0^1,我们用其重复的次数奇数2-14数量leftout

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); 
 

希望它可以帮助

0

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

A^A=0

所以,如果你XOR一个特定的号码与自己多次为偶数次,结果将是零。

这里,最初n的值是零。将被偶数次异或的次数将为零。并且存在奇数次的数字,例如2m+1次数,将导致2m事件为零,并且最后一次事件的相同数量。

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

1

按位运算符使用32位数字。操作中的任何数字操作数都被转换为32位数字。结果会转换回JavaScript数字。 ^是一个按位异或JavaScript运算符。

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

如果a和b不同,则异或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]

n=0, i=0 =>0^A[0] =>0^1 =>转换为二进制0000^0001结果0001,其等于到1

对于n=1, i=1 =>1^A[1] =>1^1 =>转换为二进制1111^0010结果1101等于13

等等...希望这个解决方案可以帮助你理解上面的表达和清除所有的疑虑。

相关问题