排他的または操作が何をするか知っていると思います-2^
つのビットが同じ値に設定されている場合、結果は0
-そうでない場合は1
. したがって、2 つの 1 ビット数 A と Bがある場合、A と B のいずれかが both 、または bothA^B
の場合、ゼロになります。つまり、との 1 の合計は偶数です...0
1
A
B
では、一度に 2 ビットずつ実行してみましょう。C と D は 2 ビットの数値です。可能な組み合わせは次のとおりです。
C D C^D
00 00 00 even
01 00 01 odd
10 00 10 odd
11 00 11 even
00 01 01 odd
01 01 00 even
10 01 11 even
11 01 10 odd
00 10 10 odd
01 10 11 even
10 10 00 even
11 10 01 odd
00 11 11 even
01 11 10 odd
10 11 01 odd
11 11 00 even
ご覧のとおり、各インスタンスでの演算はビット数を半分に減らし、1
奇数で開始した場合、結果のビット数は奇数になります (ペアの1
s は相殺されますが、他のすべては変更されないため)。 .
これで、より大きな数値 (4 ビット、8 ビット、16 ビット) で開始したときに同じことが引き続き当てはまる理由が明らかになったはずです。本質的に、アルゴリズムは 32 ビットの数値で始まり、それを 2 つの 16 ビットの数値に分割します。「2 つの 1」を取り除くことで、ビット数を半分に減らします。次に、残りの半分で動作し、残りのビットが 1 つだけになるまで繰り返します。そのビットが 1 (奇数) か 0 (偶数) かをテストすることで、答えが得られます。
明確でない場合は、x ^= x>>16
実際に上位 16 ビットを下位 16 ビットにシフトし、そこで排他的論理和を生成するような操作を行います。実際には上位ビットをクリアしないため、「混乱が取り残されます」。しかし、アルゴリズムは次の混乱を無視します。以下を参照してください (簡単にするために 8 ビットから始めます)。
x = abcdefgh
x >> 4 = 0000abcd
new x = abcdijkl
x >> 2 = 00abcdij
new x = abmnopqr
x >> 1 = 0abmnopq
new x = astuvwxy
この場合、最後の桁y
は と の XOR でr
あり、さらにとq
の XOR です。これらは、それぞれ、、 、の XOR です。ご覧のとおり、すべてのビットの XOR が得られました。上で説明したように、これは、最下位ビットが現在 aまたは aであるかどうかに応じて、「すべて偶数」または「すべて奇数」のいずれかを意味します。l,j
k,i
h,d
f,b
g,c
e,a
1
0
これが役に立ったことを願っています。