2016-11-26 74 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

等等...希望這個解決方案可以幫助你理解上面的表達和清除所有的疑慮。

相關問題