2016-11-26 11 views
1

私はこの問題に取り組んでいます。 奇数回に現れる整数は常に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

それ以外の数字を付けると、0になります。奇数回だけ表示される数字が1つしかないことが分かっている場合、他の数字は自己解読によってキャンセルされ、答えは残りの数字になります奇数回出現する。

+1

これは答えとしてマークする必要があります – Gravity

+1

そして任意のintでxoring 0は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の私たちは時代の奇数nubmerを繰り返し数でleftoutされて0と1^0でその1^1を取得します

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

は、2つの同じ番号の

0

XORは常にゼロであるのに役立ちます願っています。それはあなたが偶数回のために繰り返し自体で特定の番号をXOR場合、結果はゼロになります、だから、

A^A=0

です。

ここで、最初にnの値はゼロです。 XORされる回数は偶数回でゼロになります。そして、奇数回である数字、例えば2m+1の回数は、2m回の発生についてはゼロとなり、最後の1回の発生については同じ数となる。

このソリューションの仕組みです。

1

ビット単位の演算子は32ビットの数で動作します。演算の数値オペランドは32ビットの数値に変換されます。結果はJavaScript番号に変換されます。 ^はビット単位のXORのjavascript演算子です。

ビット単位のXOR演算子は、どちらか一方のオペランドではなく、両方のオペランドの対応するビットが1であるビット位置で1を返します。

aとbが異なる場合、XOR bは1を返します。 XOR演算の真理値表である:式n = n^A[i];

ため

a b  a XOR b 

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

説明をするためA = [1,2,3,4,5]

をさせ等しい0001バイナリ0000^0001結果に変換=>0^A[0] =>0^1 =>n=0, i=01

n=1, i=1 =>1^A[1] =>1^1 =>は13

に等しいというように...ホープ、このソリューションは、あなたが上記の式を理解し、あなたのすべての疑問をクリアするのに役立ちます1101にバイナリ1111^0010結果に変換します。

関連する問題