実際には、他の答えのいくつかは間違っているようです: 隣り合う 2 つのバイナリ反射グレイ コードが 1 ビットだけ異なることは事実です (「グレイ コード シーケンス」とは、Frank Gray によって説明されている元のバイナリ反射グレイ コード シーケンスを意味すると仮定します)。 )。ただし、1 ビット異なる 2 つのグレイ コードが隣接a => b
しているとは限りません ( という意味ではありませんb => a
)。たとえば、グレイ コード 1000 と 1010 は 1 ビットだけ異なりますが、隣接していません (1000 と 1010 はそれぞれ 10 進数で 15 と 12 です)。
a
2 つのグレー コードとb
が隣接しているかどうかを知りたい場合は、 かどうかを確認する必要がありますprevious(a) = b OR next(a) = b
。与えられたグレイ コードの場合、右端のビットを反転することによって 1 つの隣接ビットを取得し、右端のセット ビットの左にあるビットを反転することによってもう 1 つの隣接ビットを取得します。グレイ コード 1010 の場合、近隣は 1011 と 1110 です (1000 はそれらの 1 つではありません)。
これらのビットの 1 つを反転することによって前または次のネイバーを取得するかどうかは、実際にはグレイ コードのパリティに依存します。ただし、両方の隣人が必要なので、パリティをチェックする必要はありません。次の疑似コードは、2 つのグレイ コードが隣接しているかどうかを示します (C のようなビット演算を使用)。
function are_gray_neighbours(a: gray, b: gray) -> boolean
return b = a ^ 1 OR
b = a ^ ((a & -a) << 1)
end
上記のビット トリック:a & -a
数値の中で最も右に設定されたビットを分離します。そのビットを 1 ポジション左にシフトして、反転する必要があるビットを取得します。