最初に少し理論を説明します。
が 32 ビットであると仮定すると、トリックを理解できるようになりましたunsigned int
。2 ビットのサブセット (隣接する 2 つのビット) でビットをグループ化することから始めて、「再帰的に」パリティを計算し、次にそれらのサブセットでパリティ チェックを実行します。次に、計算されたばかりの 2 ビット サブセットのパリティを使用して、次に大きい 4 ビット セットのパリティをチェックします。次に、8 ビットと 16 ビットのサブセットが続きます。
グラフで見てみましょう (明確にするために最下位ビットで):
y = x ^ (x >> 1)
x: b7 b6 b5 b4 b3 b2 b1 b0
x>>1: b8 b7 b6 b5 b4 b3 b2 b1
y=: P8-7 P7-6 P6-5 P5-4 P4-3 P3-2 P2-1 P1-0
ここで、 からまでPn-m
の位置を持つビット セットのパリティを示すために表記法を使用しました。互いに素なサブセットを使用してパリティを計算する必要があるため、これらのパリティ値の 2 つのうち 1 つだけを使用します。他の値には意味がないことを示すために を付けます。したがって、次のようになります。m
n
?
え:?P7-6 ? P5-4 ? P3-2 ? P1-0
y = y ^ (y >> 2)
(より上位のビットを考慮に入れる)
y: P15-14 ? P13-12 ? P11-10 ? P9-8 ? P7-6 ? P5-4 ? P3-2 ? P1-0
y>>2: P17-16 ? P15-14 ? P13-12 ? P11-10 ? P9-8 ? P7-6 ? P5-4 ? P3-2
y=: P17-14 ? P15-12 ? P13-10 ? P11-8 ? P9-6 ? P7-4 ? P5-2 ? P3-0
P5-2
ここでも、互いに素な部分集合のパリティのみが必要なので、セットの重複を避けるために、結果の一部のビットを無視しますP9-6
。
え:?? P15-12 ??? P11-8 ??? P7-4 ??? P3-0
y = y ^ (y >> 4)
(より上位のビットを考慮に入れる)
y: P23-20 ??? P19-16 ??? P15-12 ??? P11-8 ??? P7-4 ??? P3-0
y>>4: P27-24 ??? P23-20 ??? P19-16 ??? P15-12 ??? P11-8 ??? P7-4
y=: P27-20 ??? P23-16 ??? P19-12 ??? P15-8 ??? P11-4 ??? P7-0
繰り返しますが、重複するセット (および?
読みやすくするためのグループ化)を無視します。
え:???? P23-16 ??? ???? P15-8 ??? ???? P7-0
y = y ^ (y >> 8)
(すべての 32 ビットを考慮して):
y: P31-24 ??? ???? P23-16 ??? ???? P15-8 ??? ???? P7-0
y>>8: 0 000 0000 P31-24 ??? ???? P23-16 ??? ???? P15-8
y=: P31-24 ??? ???? P31-16 ??? ???? P23-8 ??? ???? P15-0
ここでも、重複するセットを無視します。
え:???? ???? P31-16 ??? ???? ???? ???? P15-0
y = y ^ (y >> 16)
え:???? ???? P31-16 ??? ???? ???? ???? P15-0
y>>16: 0000 0000 0 000 0000 ???? ???? P31-16
y=:???? ???? P31-16 ??? ???? ???? ???? P31-0
return y & 1
え:???? ???? P31-16 ??? ???? ???? ???? P31-0
1: 0000 0000 0 000 0000 0000 0000 1
y&1: 0000 0000 0 000 0000 0000 0000 P31-0
したがって、戻り値はP31-0
引数 のビットの単なるパリティ ビットであるx
ことがわかります。これは、私たちが望んでいたものです。