反射バイナリコード(RBC )は、反射バイナリ(RB)またはフランク・グレイにちなんでグレイコードとも呼ばれ、2 つの連続する値が 1ビット(バイナリ数字)のみ異なるようにバイナリ数値システムを順序付けしたものです。
例えば、10進数の「1」を2進数で表すと通常は「001」となり、「2」は「010 」となります。グレイコードでは、これらの値は「 001」と「011 」で表されます。このようにすることで、値を1から2に増やす際に、2ビットではなく1ビットだけを変更すれば済むようになります。
グレイコードは、電気機械式スイッチからの不要な出力を防ぎ、地上デジタルテレビや一部のケーブルテレビシステムなどのデジタル通信におけるエラー訂正を容易にするために広く使用されています。これらのデバイスでグレイコードを使用することで、論理演算が簡素化され、実際のエラーが削減されます。[ 1 ]
多くのデバイスは、スイッチの開閉によって位置を示します。そのデバイスが自然二進コードを使用している場合、位置3と位置4は隣り合っていますが、二進表現の3ビットすべてが異なります。
自然二進コードの問題点は、物理スイッチが理想的ではないことです。物理スイッチが完全に同期して状態を変化させることはまずありません。上記の2つの状態間の遷移では、3つのスイッチすべてが状態を変化させます。すべてのスイッチが変化する短い期間に、スイッチは誤った位置を読み取る可能性があります。キーバウンスがなくても、遷移は011 - 001 - 101 - 100のように見えるかもしれません。スイッチが位置001にあるように見える場合、それが「実際の」位置1なのか、他の2つの位置間の遷移状態なのかを観察者は判断できません。出力が組み合わせ論理回路などを介して順序回路に入力される場合、順序回路は誤った値を格納する可能性があります。
この問題は、一度に 1 つのスイッチのみを変更することで解決できるため、位置の曖昧さがなくなり、連続する整数の集合のそれぞれ、または円形リストの各要素に、2 つのコードワードが同一ではなく、隣接する 2 つのコードワードがちょうど 1 つのシンボルだけ異なるような記号のワードを割り当てるコードが得られます。これらのコードは、隣接するコード間のハミング距離が 1 であることから、単位距離コード[ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] 、単一距離コード、単一ステップコード、モノストロフィックコード[ 7 ] [ 8 ] [ 5 ] [ 6 ]、またはシンコピックコード[ 7 ]とも呼ばれます。

原則として、与えられたワード長に対してそのようなコードは複数存在し得るが、グレイコードという用語は、最初に非負整数の特定のバイナリコード、バイナリ反射グレイコード(BRGC)に適用された。ベル研究所の研究者 ジョージ・R・スティビッツは、1941年の特許出願でそのようなコードを記述し、1943年に特許が付与された。[ 9 ] [ 10 ] [ 11 ]フランク・グレイは、1947年の特許出願で反射バイナリコードという用語を導入し、そのコードには「まだ認識された名前がない」と述べている。[ 12 ]彼は、それが「一種の反射プロセスによって従来のバイナリコードから構築できる」という事実からその名前を導き出した。


グレイコードの標準エンコーディングでは、最下位ビットは 2 オン、2 オフの繰り返しパターン(… 11001100 …) に従います。 次の桁は 4オン、4 オフのパターンです。i 番目の最下位ビットは 2 i オン、2 iオフのパターンです 。最上位桁はこの例外です。n ビットのグレイコードの場合、最上位桁は 2 n − 1 オン、2 n − 1オフのパターンに従います 。これは、2 番目に上位の桁と同じ (循環) 値のシーケンスですが、2 n − 2ビット前方にシフトされています。この 4 ビット版を以下に示します。
10進数15の場合、コードは1回のスイッチ変更だけで10進数0に転回します。これはコードの循環性または隣接性と呼ばれます。 [ 13 ]
現代のデジタル通信において、グレイコードは誤り訂正において重要な役割を果たします。例えば、QAMのようなデジタル変調方式では、データは通常4ビット以上のシンボルで送信されますが、信号のコンスタレーション図は、隣接するコンスタレーション点によって伝達されるビットパターンが1ビットだけ異なるように配置されます。これを、 1ビットの誤りを訂正できる前方誤り訂正と組み合わせることで、受信機は、コンスタレーション点が隣接する点の領域にずれる原因となる伝送エラーを訂正することが可能になります。これにより、伝送システムはノイズの影響を受けにくくなります。
スティビッツがグレイより先にこの符号を記述したにもかかわらず[ 9 ] [ 10 ] [ 11 ]、反射バイナリ符号は後にそれを使用した他の人々によってグレイにちなんで名付けられました。1953年の2つの異なる特許出願では、「反射バイナリ符号」の別名として「グレイ符号」が使用されています[ 14 ] [ 15 ]。そのうちの1つには、「最小エラー符号」と「巡回置換符号」も名前として挙げられています[ 15 ]。1954年の特許出願では、「ベル電話グレイ符号」に言及しています[ 16 ] 。その他の名前には、「巡回バイナリ符号」[ 10 ] 、 「巡回進行符号」[ 17 ] [ 10 ]、「巡回置換バイナリ」[ 18 ]、または「巡回置換バイナリ」(CPB) [ 19 ] [ 20 ]などがあります。
グレイコードは、19世紀の電気機器の発明家エリシャ・グレイに誤って帰属されることがある。[ 11 ] [ 21 ] [ 22 ] [ 23 ]
反射二進符号は、技術者に知られるようになる以前から、数学パズルに応用されていた。
バイナリ反射グレイコードは、1872年にフランスのルイ・グロスによって記述された、連続的な機械式パズル機構である古典的な中国のリングパズルの基本的な仕組みを表しています。 [ 24 ] [ 11 ]
これは、 1883 年にフランスのエドゥアール・リュカが考案したゲームに基づくハノイの塔問題の解法ガイドとして役立つ。 [ 25 ] [ 26 ] [ 27 ] [ 28 ]同様に、いわゆるブカレストの塔とクラーゲンフルトの塔のゲーム構成は、3 進数および 5 進数のグレイコードを生成する。[ 29 ]
マーティン・ガードナーは、 1972年8月のサイエンティフィック・アメリカン誌の「数学ゲーム」コラムでグレイコードについて分かりやすく解説した。[ 30 ]
このコードは、長さのハイパーキューブグラフ内でハミルトン閉路も形成する。[ 31 ]
フランスのエンジニア、エミール・ボードーが、1875年[ 32 ]または1876年[ 33 ] [ 34 ]に印刷電信システムで6ユニット(6ビット)コードから5ユニットコードに変更したとき、彼は反射バイナリコードを使用して印刷ホイール上のアルファベット文字を並べ、3ビットのみを使用して母音にコードを割り当てました。母音と子音がアルファベット順に並べられ、他の記号が適切に配置された5ビット文字コードは、反射バイナリコードとして認識されています。[ 11 ]このコードはボードーコードとして知られるようになり[ 35 ]、わずかな変更を経て、最終的に1932年に国際電信アルファベットNo.1(ITA1、CCITT-1)として採用されました。 [ 36 ] [ 37 ] [ 38 ]
ほぼ同時期に、ドイツ系オーストリア人のオットー・シェフラー[ 39 ]は、1874年にウィーンで同じ目的で5ビット反射バイナリコードを使用した別の印刷電信機を実証した。[ 40 ] [ 11 ]
互換カラーテレビで使用されるようになった信号方式の発明で有名になったフランク・グレイは、真空管ベースの装置を使用してアナログ信号を反射バイナリコードグループに変換する方法を発明した。1947年に出願されたこの方法と装置は、1953年に特許が付与され[ 12 ]、グレイの名前がコードに定着した。グレイが特許を取得した「PCMチューブ」装置は、ベル研究所のレイモンド・W・シアーズがグレイとウィリアム・M・グッドールと共同で製作したもので、グッドールは反射バイナリコードのアイデアはグレイによるものだと述べている[ 41 ] 。

グレイが最も関心を持っていたのは、アナログ信号をデジタル信号に変換する際の誤差を最小限に抑えるために、これらの符号を利用することだった。彼の符号は、今日でもこの目的で使用されている。


リニア位置エンコーダおよびロータリー位置エンコーダ(絶対エンコーダおよび直交エンコーダ)では、重み付きバイナリ符号化よりもグレイコードが優先的に使用されます。これにより、位置のバイナリ表現において複数のビットが変化する際に、一部のビットが他のビットよりも先に変化することによって誤読が発生する可能性を回避できます。
例えば、ロータリーエンコーダの中には、同心円状のリング(トラック)上に導電性のグレイコードパターンが刻まれたディスクを備えているものがあります。各トラックには、導電性のコードパターンと電気的に接触する固定式の金属製スプリング接点が設けられています。これらの接点が連携して、グレイコード形式の出力信号を生成します。一方、光学式または磁気式のセンサーを用いた非接触機構を採用してグレイコード出力信号を生成するエンコーダもあります。
可動エンコーダの機構や精度に関わらず、コードが読み取り(サンプリング)されるまさにその瞬間に変化する可能性があるため、特定の位置(コード境界)で位置測定誤差が発生する可能性があります。バイナリ出力コードでは、すべてのビットを全く同時に変化させることは不可能なため、位置測定に大きな誤差が生じる可能性があります。位置をサンプリングする時点で、一部のビットが変化し、他のビットが変化していない場合、サンプリングされた位置は不正確になります。絶対エンコーダの場合、指示された位置は実際の位置から大きくずれる可能性があり、インクリメンタルエンコーダの場合は、位置追跡が損なわれる可能性があります。
一方、位置エンコーダで使用されるグレイコードでは、連続する2つの位置のコードが1ビットしか異ならないため、一度に変化するビットは1ビットのみとなります。この場合、最大位置誤差は小さくなり、実際の位置に隣接する位置を示すことになります。
グレイコードのハミング距離特性により、遺伝的アルゴリズムで使用されることがあります。[ 13 ]コードの突然変異により、ほとんどが漸進的な変化が可能になりますが、1ビットの変更で大きな飛躍が生じ、新しい特性につながることもあるため、この分野で役立つ可能性があります。
グレイコードは、 1953年以来カルノー図の軸のラベル付けにも使用されており[ 42 ] [ 43 ] [ 44 ] 、 1958年以来ヘンドラー円グラフにも使用されている[ 45 ] [ 46 ][47] [ 48 ] 。これらはどちらも論理回路最小化のためのグラフィカルな方法である。
現代のデジタル通信において、1次元および2次元グレイコードは、誤り訂正を適用する前の誤り防止において重要な役割を果たします。例えば、QAMのようなデジタル変調方式では、データは通常4ビット以上のシンボルで送信されますが、信号のコンスタレーション図は、隣接するコンスタレーション点によって伝達されるビットパターンが1ビットだけ異なるように配置されます。これを、1ビットの誤りを訂正できる前方誤り訂正と組み合わせることで、受信機は、コンスタレーション点が隣接する点の領域にずれる原因となる伝送エラーを訂正することが可能になります。これにより、伝送システムはノイズの影響を受けにくくなります。
デジタルロジック設計者は、異なるクロック周波数で動作する同期ロジック間でマルチビットのカウント情報を伝達するために、グレイコードを広く利用します。このロジックは、異なる「クロックドメイン」で動作していると考えられます。これは、多様なクロック周波数で動作する大型チップの設計において不可欠です。
システムが、ある制御系のオン/オフ状態のすべての組み合わせを順次実行し、制御系の変更に相当なコスト(時間、摩耗、人的作業など)がかかる場合、グレイコードを用いることで、状態の組み合わせごとに設定変更を1回に抑えることができます。例えば、配管システムの手動操作バルブのすべての設定組み合わせをテストする場合などがこれに該当します。
バランスのとれたグレイコードは、すべてのビットを均等な頻度で反転させるように構築できます[ 49 ]。ビット反転が均等に分布しているため、これは次のように最適です。バランスのとれたグレイコードは、各桁のビット反転の最大数を最小化します。
ジョージ・R・スティビッツは1941年にバイナリパルス計数装置で反射バイナリコードを利用した。[ 9 ] [ 10 ] [ 11 ]
グレイコードカウンタの典型的な使用例は、異なるクロックドメインに存在する読み取りポートと書き込みポートを持つFIFO (先入れ先出し) データバッファの構築です。このようなデュアルポート FIFO 内の入力カウンタと出力カウンタは、カウントがクロックドメインをまたぐときに無効な過渡状態が捕捉されないように、グレイコードを使用して格納されることがよくあります。[ 50 ]更新された読み取りポインタと書き込みポインタは、クロックドメインが変化すると、各ドメインで FIFO が空か満杯かを追跡できるように、クロックドメイン間で渡される必要があります。このクロックドメイン転送では、ポインタの各ビットが非決定論的にサンプリングされます。したがって、各ビットについて、古い値または新しい値のいずれかが伝播されます。そのため、サンプリングポイントでマルチビットポインタの複数のビットが変化すると、「間違った」バイナリ値 (新しい値でも古い値でもない) が伝播される可能性があります。グレイコードは、1 つのビットのみが変化することを保証することで、サンプリング可能な値が新しいマルチビット値または古いマルチビット値のみであることを保証します。通常、2 のべき乗の長さのグレイコードが使用されます。
電子システムでは、デジタルバスが一度に 1 ずつしか増減できない量を伝送するために使用されることがあります。たとえば、クロック ドメイン間またはデジタル - アナログ コンバータに渡されるイベント カウンタの出力などです。このようなアプリケーションにおけるグレイ コードの利点は、コードのビットを表す多数のワイヤの伝搬遅延の違いによって、受信値がグレイ コード シーケンス外の状態を経由することがないことです。これは、機械式エンコーダの構築におけるグレイ コードの利点と似ていますが、この場合、グレイ コードの発生源は電子カウンタです。カウンタ自体はグレイ コードでカウントする必要があります。カウンタがバイナリで動作する場合は、カウンタからの出力値をグレイ コードに変換した後、再クロックする必要があります。これは、値がバイナリからグレイ コードに変換されるときに、バイナリデータ ビットがバイナリ - グレイ変換回路に到着するタイミングの違いによって、コードが一時的に大きくシーケンスから外れた状態を経由する可能性があるためです。[注 1]カウント値をグレイコードに変換する回路の後にクロック付きレジスタを追加すると、クロックサイクル分の遅延が発生する可能性があるため、グレイコードで直接カウントする方が有利な場合がある。[ 51 ]
グレイコードカウンタで次のカウント値を生成するには、現在格納されているカウント値をインクリメントする組み合わせ論理回路が必要です。グレイコード数をインクリメントする1つの方法は、それを通常のバイナリコードに変換し、[ 52 ]標準的なバイナリ加算器で1を加算し、結果をグレイコードに戻すことです。[ 53 ]グレイコードでのカウントの他の方法については、 Robert W. Doranのレポートで説明されており、バイナリリップルカウンタのマスタースレーブフリップフロップの最初のラッチからの出力を取得する方法などが含まれています。[ 54 ]
実行可能コードの実行は通常、ローカルに連続するアドレスの命令メモリアクセスパターンを引き起こすため、バイナリアドレッシングの代わりにグレイコードアドレッシングを使用したバスエンコーディングは、アドレスビットの状態変化の数を大幅に削減し、それによって一部の低消費電力設計でCPUの消費電力を削減することができます。 [ 55 ] [ 56 ]
自然な二進数コードシステムでは、最下位ビットは数値が偶数(0)か奇数(1)かを示しますが、グレイコードにはこの特性がありません。連続するグレイコードでは1ビットだけが変化するため、1ビットの数は偶数と奇数が交互に現れます。したがって、グレイコードの偶数性を確認するには、1ビットの数を数える必要があります。つまり、1ビットの数が偶数であれば、そのグレイコードは偶数です。
ZilogのZ80、ジャパンアスキーのR800、Intelの8086などの一部のプロセッサにはパリティステータスフラグがあり、これは一部のレジスタのビットごとの偶数性を示し、それらのレジスタのアップビット数が偶数かどうかを簡単にチェックできる。


nビットのバイナリ反転グレイコードリストは、n − 1 ビットのリストから、リストを反転(つまり、エントリを逆順にリスト化)し、元のリストのエントリにバイナリ0を接頭辞として付け、反転したリストのエントリにバイナリ1を接頭辞として付け、元のリストと反転したリストを連結することによって再帰的に生成できます。[ 11 ] 例えば、n = 2 リストからn = 3 リストを生成する場合:
1ビットのグレイコードはG 1 = ( 0,1 ) です。これは、長さゼロの単一のエントリからなるゼロビットのグレイコードG 0 = ( Λ )から、上記のように再帰的に構築されると考えることができます。G nからG n +1を生成するこの反復プロセスにより、標準反射コードの次の特性が明らかになります。
これらの特性は、バイナリ値を対応するグレイコードに変換するシンプルで高速な方法を示唆しています。入力値の次の上位ビットが1に設定されている場合、各ビットは反転されます。ビットシフトと排他的論理和演算が利用可能であれば、これらを並列に実行できます。n番目のグレイコードは、計算によって得られます。0ビットを先頭に追加するとコードワードの順序は変更されず、1ビットを先頭に追加するとコードワードの順序が反転します。位置のビットが符号語の順序が反転すると、隣接するブロックの順序が符号語の順序が反転します。たとえば、3ビットの符号語シーケンスでビット0が反転すると、隣接する2つの符号語の順序が反転します。
ビット1が反転すると、2つのコードワードのブロックの順序が変わります。
ビット2が反転した場合、4つのコードワードのブロックの順序が逆になります。
したがって、ビットに対して排他的または論理和を実行するポジションビットと共にポジションコードワードの順序はそのまま残します。ブロックの順序を反転しますコードワードの場合これは、グレイコードを生成するための反射・接頭辞法とまったく同じ操作です。
同様の方法で逆変換を実行することもできますが、各ビットの計算は次の上位ビットの計算値に依存するため、並列実行はできません。はth グレイコードビット ((最上位ビット)はth バイナリコード化ビット (( が最上位ビットである場合)、逆変換は再帰的に次のように表すことができます。、 そしてあるいは、グレイコードをバイナリ数にデコードすることは、グレイコードのビットのプレフィックス和として記述することもできます。プレフィックス和における個々の加算演算は、2を法として実行されます。
バイナリ反射グレイコードを反復的に構築するには、ステップ 0 で、、ステップバイナリ表現における最下位ビット1の位置を見つけるそして、前のコードのその位置にあるビットを反転させる次のコードを取得するにはビット位置は 0、1、0、2、0、1、0、3、… [ nb 2 ]から始まります。これらの値を効率的に計算するアルゴリズムについては、find first set を参照してください。
C言語の以下の関数は、バイナリ数とそれに対応するグレイコード間の変換を行います。グレイコードからバイナリへの変換では、各ビットを一度に1つずつ処理する必要があるように思えるかもしれませんが、より高速なアルゴリズムが存在します。[ 57 ] [ 52 ] [ nb 1 ]
typedef unsigned int uint ;// この関数は、符号なしバイナリ数を反射バイナリグレイコードに変換します。uint BinaryToGray ( uint num ) { return num ^ ( num >> 1 ); // 演算子 >> は右シフトです。演算子 ^ は排他的論理和です。}// この関数は、反射されたバイナリグレイコード数をバイナリ数に変換します。uint GrayToBinary ( uint num ) { uint mask = num ; while ( mask ) { // 各グレイコードビットは、それより上位のすべてのビットと排他的論理和されます。mask >>= 1 ; num ^= mask ; } return num ; }// SWAR (レジスタ内 SIMD) 技術を使用して、32 ビット以下のグレイ コードに対してより効率的なバージョンです。// 並列プレフィックス XOR 関数を実装します。代入文は任意の順序で記述できます。// // この関数は、ステップを追加することで、より長いグレイ コードにも適応できます。uint GrayToBinary32 ( uint num ) { num ^= num >> 16 ; num ^= num >> 8 ; num ^ = num >> 4 ; num ^= num >> 2 ; num ^= num >> 1 ; return num ; } // 4 ビット同時変換バリアントは、バイナリ数 (abcd)2 を (abcd)2 ^ (00ab)2 に変更し、次に (abcd)2 ^ (00ab)2 ^ (0abc)2 ^ (000a)2 に変更します。最新のプロセッサでは、 CLMUL命令セットを利用することで、デコードステップにおけるALU命令の数を減らすことができます。MASKが単一のゼロで終わる定数バイナリ文字列(1のみ)である場合、MASKとxのグレイエンコーディングとのキャリーなし乗算は、常にxまたはそのビットごとの否定のいずれかになります。
実際には、「グレイコード」とはほぼ常にバイナリ反射グレイコード(BRGC)を指します。しかし、数学者たちは他の種類のグレイコードも発見しています。BRGCと同様に、それぞれが単語のリストで構成され、各単語は次の単語と1桁だけ異なります(各単語は次の単語とのハミング距離が1です)。
長さが偶数であれば、 2 n未満の長さのnビットのバイナリ グレイ コードを構築することが可能です。 1 つの方法は、バランスの取れたグレイ コードから始めて、先頭と末尾、または中間の値のペアを削除することです。[ 58 ] OEISシーケンス A290772 [ 59 ]は、ゼロを含み、最小ビット数を使用する長さ2 nの可能なグレイ シーケンスの数を示しています。
バイナリ反射グレイコード以外にも、多くの特殊なグレイコードが存在します。その一つがn値グレイコード、別名非ブールグレイコードです。名前が示すように、このタイプのグレイコードは符号化に非ブール値を使用します。
例えば、3進(三進)グレイコードでは、 0、1、2 の値を使用します。[ 29 ] ( n , k )-グレイコードは、 k桁のn進グレイコードです。[ 60 ] (3, 2)-グレイコード の要素のシーケンスは、 00、01、02、12、11、10、20、21、22です。( n , k )-グレイコードは、BRGC のように再帰的に構築することも、反復的に構築することもできます。 ( N , k )-グレイコードを反復的に生成するアルゴリズムが ( C言語で) 示されています。
// 入力: base、digits、value // 出力: Gray // 指定された base と digits を使用して、値を Gray コードに変換します。// 値のシーケンスを反復処理すると、// 一度に 1 つの桁だけが変化する Gray コードのシーケンスになります。void toGray ( unsigned base , unsigned digits , unsigned value , unsigned gray [ digits ]) { unsigned baseN [ digits ]; // エントリごとに 1 つの桁を持つ通常の base-N 数を格納しますunsigned i ; // ループ変数// 通常の baseN 数を baseN 配列に格納します。基数 10 の場合、109 // は [9,0,1] として格納されますfor ( i = 0 ; i < digits ; i ++ ) { baseN [ i ] = value % base ; value = value / base ; } // 通常の baseN 数を同等の Gray コードに変換します。 // ループは最上位桁から始まり、下に進むことに注意してください。 unsigned shift = 0 ; while ( i -- ) { // Gray 桁は、上位桁の合計だけ下にシフトされます。gray [ i ] = ( baseN [ i ] + shift ) % base ; shift = shift + base - gray [ i ]; // シフトが正になるように base から減算します} } // 例// 入力: value = 1899、 base = 10、 digits = 4 // 出力: baseN[] = [9,9,8,1]、 gray[] = [0,1,7,1] // 入力: value = 1900、 base = 10、 digits = 4 // 出力: baseN[] = [0,0,9,1]、 gray[] = [0,1,8,1]( n , k )-グレイコードには、他にもグレイコードアルゴリズムがあります。上記のアルゴリズムで生成される( n , k )-グレイコードは常に循環的です。Guan [ 60 ]によるアルゴリズムなど、一部のアルゴリズムはkが奇数の場合にこの性質を持ちません。一方、この方法では一度に1桁しか変化しませんが、ラップ(n - 1から0へのループ)によって変化させることができます。Guanのアルゴリズムでは、カウントが交互に増加と減少するため、2つのグレイコード桁間の数値差は常に1になります。
グレイコードは一意に定義されるものではなく、そのコードの列の順列もグレイコードとなる。上記の手順で生成されるコードは、桁の重要度が低いほど変化頻度が高くなり、通常の計数方法と類似したものとなる。
スキューバイナリ数システムも参照してください。これは、各増分で最大2桁しか変化しない、3進数システムの変種です。各増分は最大1桁の繰り上がり演算で実行できます。
バイナリ反射グレイコードは多くのシナリオで有用ですが、「均一性」の欠如のため、特定の場合には最適ではありません。[ 49 ]バランス型グレイコードでは、異なる座標位置における変化の数が可能な限り近くなります。これをより正確にするために、遷移シーケンスを持つR進完全グレイサイクルをGとします。Gの遷移カウント(スペクトル)は、次のように定義される整数の集合です。
グレイコードは、遷移回数がすべて等しい場合、均一または均一にバランスが取れていると言えます。この場合、次のようになります。すべてのkに対して。明らかに、このような符号は、nが2のべき乗の場合にのみ存在します。 [ 61 ] nが2のべき乗でない場合、2つの遷移カウントの差が最大2であるようなバランスの取れた2進符号を構築することが可能です。したがって、(両方のケースを組み合わせると)すべての遷移カウントは、または[ 49 ]グレイコードは、すべての遷移カウントが隣接する2のべき乗である場合、指数的にバランスが取れている可能性があり、そのようなコードはすべての2のべき乗に対して存在します。[ 62 ]
例えば、バランスの取れた4ビットグレイコードには16の遷移があり、これらは4つの位置すべてに均等に分配できるため(位置ごとに4つの遷移)、均一にバランスが取れています。[ 49 ]
一方、バランスのとれた 5 ビット グレイ コードには合計 32 の遷移があり、これは位置間で均等に分配することはできません。この例では、4 つの位置にそれぞれ 6 つの遷移があり、1 つの位置に 8 つの遷移があります。[ 49 ]
ここでは、 nに対してn桁のバランスのとれたグレイコードを生成できる、バランスのとれたバイナリ グレイコードの構成[ 63 ]と実装[ 64 ]を示します。主な原理は、( n + 2) 桁のグレイコードを帰納的に構成することです。 n桁のグレイコードGが与えられたとき、バランス特性が維持されるようにします。これを行うために、次の分割を検討します。偶数個のL個の空でないブロックに分割する。
どこ、、 そしてこの分割は-桁のグレイコード
遷移多重度を定義すると
を、パーティション内の連続するブロック間で位置iの数字が変化する回数とすると、このパーティションによって生成される ( n + 2) 桁のグレイコードの場合、遷移スペクトルはは
この構成の繊細な部分は、バランスのとれたn桁のグレイコードを適切に分割して、それによって誘導されるコードがバランスを保つようにすることだが、そのためには遷移多重度だけが重要となる。別の桁で別のブロックを分割する遷移によって生成されるグレイコードは全く同じ遷移スペクトルを持つしたがって、例えば[ 62 ]最初の数字での遷移2つのブロックの間にあるものとして。統一コードは、次のような場合に見つけることができます。そして、この構成はR項の場合にも拡張できます。[ 63 ]
ロングラン(または最大ギャップ)グレイコードは、同じ位置の連続する桁の変化間の距離を最大化します。つまり、任意のビットの最小ラン長は可能な限り長く変化しません。[ 65 ]
単調符号は相互接続ネットワークの理論において有用であり、特にプロセッサの線形アレイの拡張を最小化するのに役立ちます。[ 66 ]バイナリ文字列の重みを文字列内の 1 の数と 定義すると、重みが厳密に増加するグレイコードは明らかに存在しませんが、コードが次の重みに到達する前に 2 つの隣接する重みを通過するようにすることで、これを近似することができます。
単調グレイコードの概念を次のように形式化できます。ハイパーキューブの分割を考えます。等しい重みを持つ頂点のレベルに分割します。
のためにこれらのレベルは。 させてのサブグラフとする誘発される、そしてエッジは単調グレイコードは、ハミルトン経路である。いつでも前に来る経路上で、。
任意のnに対する単調なn桁のグレイコードの洗練された構成は、サブパスを再帰的に構築するというアイデアに基づいています。長さエッジを持つ[ 66 ]我々は定義する、いつでもまたは、 そして
そうでなければ。ここでは、は適切に定義された順列であり、は、座標が置換されたパスPを指します。これらの経路は、2つの単調なn桁のグレイコードを生み出す。そしてによって与えられた
選択これらのコードが実際にグレイコードであることを保証するものは、.最初のいくつかの値は下記の表に示されています。
これらの単調グレイコードは、各要素をO ( n ) 時間で生成できるように効率的に実装できます。このアルゴリズムは、コルーチンを使用して最も簡単に記述できます。
単調符号は、連結な頂点推移的グラフはすべてハミルトン路を含むというロヴァース予想と興味深い関連性がある。「中間レベル」部分グラフは頂点推移的である(つまり、その自己同型群は推移的であるため、各頂点は同じ「局所環境」を持ち、座標と二進数を再ラベル付けして自己同型を得ることができるため、他の頂点と区別できない)。この部分グラフにおけるハミルトン路を見つける問題は「中間レベル問題」と呼ばれ、より一般的な予想への洞察を与えることができる。この問題は、に対して肯定的に解決されている。、また、単調符号の前述の構成により、少なくとも長さが 0.839N のハミルトン経路が保証される。ここで、Nは中間レベルのサブグラフの頂点の数である。[ 67 ]
もう 1 つのグレイ コードの種類であるベケット グレイ コードには、対称性に興味を持っていたアイルランドの劇作家サミュエル ベケットにちなんで名付けられています。彼の戯曲「クワッド」には 4 人の俳優が登場し、16 の期間に分かれています。各期間は、4 人の俳優のうちの 1 人が舞台に出入りすることで終わります。戯曲は空の舞台で始まり、空の舞台で終わります。ベケットは、俳優の各サブセットが舞台に 1 回だけ登場することを望んでいました。[ 68 ]明らかに、現在舞台にいる俳優のセットは 4 ビットのバイナリ グレイ コードで表現できます。しかし、ベケットは脚本にさらに制約を加えました。彼は、最も長く舞台にいた俳優が常に退場するように俳優が出入りすることを望んでいました。俳優は FIFOキューで表現でき、(舞台上の俳優のうち) デキューされる俳優は常に最初にエンキューされた俳優になります。[ 68 ]ベケットは自身の戯曲のベケット・グレイ符号を見つけることができず、実際、考えられるすべてのシーケンスを網羅的にリストアップしても、n = 4 の場合、そのような符号は存在しないことが明らかになった。今日では、n = 2、5、6、7、8 の場合、そのような符号が存在するが、n = 3 または 4 の場合、存在しないことが知られている。8 ビットのベケット・グレイ符号の例は、ドナルド・クヌースの『コンピュータプログラミングの技法』に掲載されている。[ 11 ]澤田とウォンによれば、 n = 6の場合の探索空間は15 時間で探索でき、n = 7の場合の解は9500 個見つかっている。[ 69 ]

スネーク・イン・ザ・ボックス・コード、またはスネークとは、 n次元ハイパーキューブ・グラフにおける誘導パスのノードのシーケンスであり、コイル・イン・ザ・ボックス・コード[ 70 ]またはコイルとは、ハイパーキューブにおける誘導サイクルのノードのシーケンスである。グレイコードとして見ると、これらのシーケンスは、任意の 1 ビットの符号化エラーを検出できるという特性を持つ。この種のコードは、1950 年代後半にWilliam H. Kautzによって初めて記述された[ 3 ] 。それ以来、与えられたハイパーキューブ次元に対して可能な限り最大のコードワード数を持つコードを見つけることに関する多くの研究が行われてきた。
もう1つのグレイコードの種類は、ノーマン・B・スペディング[ 71 ] [ 72 ]によって開発され、ヒルトゲン、パターソン、ブランデスティニによって「Single-track Gray Codes (1996)」で改良されたシングルトラックグレイコード(STGC)です。[ 73 ] [ 74 ] STGCは、連続する2つの単語がちょうど1つの位置で異なるような、長さnのP個の一意のバイナリ符号化の巡回リストであり、リストをP × n行列として調べると、各列は最初の列の巡回シフトになります。[ 75 ]

その名称は、ロータリーエンコーダでの使用に由来する。ロータリーエンコーダでは、複数のトラックが接点によって検出され、それぞれに対して0または1の出力が得られる。異なる接点が正確に同じタイミングで切り替わらないことによるノイズを低減するために、接点から出力されるデータがグレイコードになるようにトラックを設定するのが望ましい。高い角度精度を得るには、多数の接点が必要となる。少なくとも1°の精度を達成するには、1回転あたり少なくとも360個の異なる位置が必要であり、そのためには最低9ビットのデータが必要となり、したがって同じ数の接点が必要となる。
すべての接点が同じ角度位置に配置されている場合、少なくとも 1° の精度を持つ標準的な BRGC を得るには 9 トラックが必要です。しかし、メーカーが接点を別の角度位置 (ただし、中心軸からの距離は同じ) に移動した場合、同じ出力を得るためには、対応する「リング パターン」を同じ角度に回転させる必要があります。最上位ビット (図 1 の内側のリング) を十分に回転させると、次のリングと完全に一致します。両方のリングが同一であるため、内側のリングを切り取り、そのリングのセンサーを残りの同一のリング (ただし、そのリング上の他のセンサーからその角度だけオフセット) に移動できます。1 つのリング上のこれらの 2 つのセンサーで直交エンコーダーが構成されます。これにより、「1° 分解能」の角度エンコーダーのトラック数が 8 トラックに削減されます。BRGC では、トラック数をさらに削減することはできません。
長年にわたり、トルステン・シルケ[ 76 ]をはじめとする数学者たちは、2つのセンサーと1つのトラックを持つ直交エンコーダを除いて、単一のトラック上で連続する位置が単一のセンサーでのみ異なるように位置を符号化することは不可能だと考えていた。そのため、8つのトラックが大きすぎる用途では、人々は単一トラックのインクリメンタルエンコーダ(直交エンコーダ)または2トラックの「直交エンコーダ+基準ノッチ」エンコーダを使用していた。
しかし、ノーマン・B・スペディングは、それが可能であることを示すいくつかの例を添えて、1994年に特許を登録した。[ 71 ]単一のトラック上のn 個のセンサーで 2 n 個の位置を識別することは不可能だが、それに近い数を識別できる。エツィオンとパターソンは、n が 2 のべき乗である場合、n個のセンサーで識別できる位置は最大で 2 n − 2 n個であり、素数nの場合は限界が 2 n − 2 個であると推測している。[ 77 ]著者らは、最適であると考える長さ 9 の 504 位置の単一トラックコードを生成した。この数は 2 8 = 256より大きいため、BRGC は 9 個のセンサーで 512 個の位置を識別できるが、どのコードでも 8 個以上のセンサーが必要となる。
P = 30、n = 5の場合のSTGCを 以下に再現する。
各列は最初の列の巡回シフトであり、任意の行から次の行への変化は 1 ビットのみです。[ 78 ] シングル トラックの性質 (コード チェーンと同様) は、これらのホイールの製造において (BRGC と比較して) 有用であり、必要なトラックは 1 つだけであるため、コストとサイズが削減されます。グレイ コードの性質は、 (チェーン コード、またはデ ブルイン シーケンスとも呼ばれる) 有用であり、一度に変化するセンサーは 1 つだけであるため、2 つの離散状態間の遷移中の不確実性は、デバイスが分解できる角度測定の単位のプラスまたはマイナス 1 つだけになります。[ 79 ]

この 30 度の例が追加されて以来、より高い角度分解能の例に多くの関心が寄せられています。2008 年に、Gary Williams [ 80 ]は、以前の研究[ 77 ]に基づいて、1 度の分解能を提供する 9 ビットのシングル トラック グレイ コードを発見しました。このグレイ コードを使用して実際のデバイスが設計され、Thingiverseサイトで公開されました。このデバイス[ 81 ]は、etzenseep (Florian Bauer) によって 2022 年 9 月に設計されました。
P = 360、n = 9の場合のSTGCをここに再現します。

2次元グレイコードは、直交振幅変調(QAM)コンスタレーションの隣接点におけるビットエラーの数を最小限に抑えるために通信で使用されます。典型的な符号化では、水平方向と垂直方向の隣接するコンスタレーション点は1ビット異なり、対角方向の隣接する点は2ビット異なります。[ 82 ]
2次元グレイコードは、位置識別スキームにも使用されており、地球表面のメルカトル図法などのエリアマップにコードを適用し、マンハイム距離などの適切な循環2次元距離関数を使用して2つのエンコードされた位置間の距離を計算することで、ハミング距離の特性とメルカトル図法の循環継続を組み合わせることができます。[ 83 ]
特定のコード値からその部分(例えば、4ビットのグレイコードの最後の3ビット)を抽出すると、結果として得られるコードは「超過グレイコード」となります。このコードは、元の値をさらに増加させた場合に、抽出されたビットが逆方向にカウントされるという特性を示します。これは、グレイエンコードされた値が、従来のバイナリエンコードで知られているような、最大値を超えて増加した際のオーバーフロー動作を示さないためです。
例:3ビットグレイコードの最上位値である7は、(0)100としてエンコードされます。これに1を加えると、8となり、グレイコードでは1100とエンコードされます。元の4ビットコードをさらに増やしても、最後の3ビットはオーバーフローせず、逆方向にカウントされます。
複数のグレイコード値を連続的に出力するセンサーを使用する場合、センサーがそれらの複数の値を単一のグレイコードでエンコードして出力するのか、それとも個別のグレイコードとして出力するのかに注意する必要があります。そうでない場合、「オーバーフロー」が想定されるときに値が逆方向にカウントされているように見える可能性があるからです。
全単射写像 { 0 ↔ 00 , 1 ↔ 01 , 2 ↔ 11 , 3 ↔ 10 } は、有限体上の距離空間と空間の間に等長写像を確立する。ハミング距離で与えられる計量と有限環上の計量空間を用いて(通常のモジュラー演算)は、リー距離によって与えられる計量を持つ。この写像は、ハミング空間の等長写像に適切に拡張される。そして。その重要性は、さまざまな「良い」が必ずしも線形ではないコード間の対応関係を確立することにある。例えば、グレーマップ画像など。リング線形コードから[ 84 ] [ 85 ]
グレイコードに類似したバイナリコードには、以下のようなものがあります。
以下の二進化十進数(BCD)コードは、グレイコードのバリアントでもあります。
[…] ボールのセットを同様の桁数を持つ数値で表すと、各パルス後のボールの位置がより明確になります。各桁は、たとえば 0 と 1 の 2 つの任意の値のいずれかを取ることができます。上側の位置を 0、下側の位置を […] 1 と呼ぶと、カウンタの設定は、左から右に 0,100,000 と読み取ることができます。 […] 以下は、最初の 5 つのボールで受信した最初の 16 パルスのパルス数を、この形式のバイナリ表記に変換したものです […] パルス数 […] バイナリ表記 […](4ページ)
光学エンコーダ
で最も一般的なコード ホイールのタイプに
は、「オン/オフ」出力の周期的なシーケンスを生成するように設計された周期的なバイナリ コード パターンが含まれています。周期的なバイナリ コードとは、周期進行コード、反射バイナリ コード、およびグレイ コードとも呼ばれます。このコードは、
ベル電話研究所
の
GR Stibitz
によって考案され、同じく BTL の
Frank Grayによって
パルス コード変調
システム用に最初に提案されました
。そのため、グレイ コードという名前が付けられました。グレイコードまたは循環コードは、主にコード遷移時のエラーの可能性を排除し、重大な曖昧さを生じさせないようにするために使用されます。[…]
[…] デコード。 […] CPB または
WRD
コードをデコードするには、単純な反転ルールを適用できます。上位トラックの読み取りによって、下位トラックの変換方法が決まります。反転ルールは、CPB の場合は行ごとに適用され、WRD の場合は、10 桁ごとまたは行ごとに適用されます。したがって、CPB の最上部または最も変化の遅いトラックから始め、結果が奇数 (1) の場合は、次のトラックの値を反転する必要があります。つまり、1 の場合は 0、0 の場合は 1 になります。ただし、最初のトラックが偶数 (0) の場合は、2 番目のトラックは読み取ったとおりのままです。つまり、0 の場合は 0、1 の場合は 1 になります。ここでも、2 番目のトラックの読み取り結果が奇数の場合は、3 番目のトラックの読み取りが反転され、以下同様です。奇数が偶数に変更された場合、その下の行は反転されず、偶数が奇数に変更された場合、その下の行は反転されます。このルールをパターンに適用した結果は、
純粋なバイナリ
(PB) パターンであり、各トラックまたは桁には明確な数値 (この例では 1、2、4、8 など) を割り当てることができます。 […] WRDコードに行ごとの反転ルールを適用すると、
1、2、4、2のコード
パターンが生成されます。ここでも、各桁に数値を与え、10桁ごとに合計することができます。桁の合計は、例えば高速スキャンシステムでは非常に有用ですが、並列復号システムでは、各バイナリカルテットまたは10桁を独立した単位として扱うのが一般的です。つまり、最初の、または上位の10桁が奇数の場合、2番目の10桁はDトラックを反転することで修正または補数化され、以下同様に処理されます。その結果、修正されたWRDコードの繰り返しパターンが得られます。必要な変更はDトラックまたは補数桁の意味を反転することだけなので、これは非常に簡単に実現できます。[…]
(8+82ページ)(注:著者はグレイコードについて全く言及しておらず、標準的なグレイコードを「巡回置換二進コード」(CPB)と呼んでいるが、書籍索引では誤って「巡回純粋二進コード」と記載されている。)
[…] この符号の考案者については、グレイという名の二人の発明家が関連付けられているため、多少混乱があるようだ。私が初めてこの名前を聞いたとき、エリシャ・グレイのことだと解釈した。ヒースも彼がこの符号を使ったことを証言している。多くの人は、1947年に符号化管への応用を初めて提案したベル電話研究所のフランク・グレイのことだと解釈している。彼の特許は参考文献に記載されている。[…](2+448+2ページ)
[…] Der um die Mitte des J[ahres] 1874 Patenti[e]rte, ebenfalls dem
Highton
'schen verwandte Typendrucker des französischen Telegraphen-Verwaltungsbeamten Baudot wurde bei seiner 1875 Patenti[e]rten Weiterentwicklung in einen fünffachenウムゲヴァンデルト […]
[…] ボーの試作機(製作に4年)は1876年に製作された。送信機にはピアノに似た5つの鍵盤があった。メッセージはボーが考案した特別な5要素コードで送信された[…]
[…] 1872 年、[Baudot] は、複数のオペレーターが 1 本の電線で同時に送信でき、送信が受信されると、それを紙片に通常のアルファベット文字で印刷できる電信システムの研究を開始しました。彼は 1874 年 6 月 17 日にそのようなシステムの特許を取得しました。 […] 可変遅延の後に単一ユニットのパルスが続く代わりに、Baudot のシステムでは、各文字を送信するために均一な 6 時間単位を使用しました。 […] 彼の初期の電信はおそらく 6 ユニットコードを使用していたと思われます […] 1877 年の記事で
Davy
に帰属させています。 […] 1876 年、Baudot は 5 ユニットコードを使用するように機器を再設計しました。しかし、句読点や数字が必要な場合もあったため、彼は
ヒューズ
から、特殊な文字間スペースと数字間スペースの文字を2つ採用し、印刷せずに用紙を送りながら同時に大文字と小文字を切り替えるようにした。彼がこの頃から使い始めた5ユニットのコードは、彼のキーボードに合わせて構成されており、左手で操作するスイッチで各文字の2ユニットを、右手で操作するスイッチで残りの3ユニットを制御していた。
[…] 1874 年、
シェフラーは
別の
印刷電信機を発明しました。これは
ボードー
と同様の 4 重システムです
が、機械的にはより洗練されています。
ヒューズ電信機に
は、送信側と受信側に 1 つずつ、同期して回転する 2 つの指がありました。ピアノのようなキーボードでオペレーターが文字を選択し、それによって対応する方向に回転する指に接触します。受信側の指はこの瞬間同じ方向を向いているため、受信側は正しい文字を印刷できます。ボードーとシェフラーの印刷電信機は 5 ビットのバイナリ コードを使用しています。… シェフラーのコードは反射バイナリ コードです。F
. グレイが
1953 年に
PCM
で特許を取得したことを、シェフラーは 1874 年に同様の理由、つまり信頼性のために、自身の電信機に適用していました。彼は、5つのカムを順番にすべての組み合わせで感知する接触指を備えており、正しい組み合わせが印刷をトリガーする。指の動きを最小限に抑えるには、反射二進コードが解決策となる。シェフラーにとって、このアイデアはさほど重要なものではなかった。より正確には、このコードはオーストリア郵便局員のヨハン・ネポムク・トイフェルハルトによる手紙に脚注として
挿入されており
、シェフラーが様々な組み合わせで木の棒を組み合わせ、最適な解を見つけるまで試行錯誤を繰り返した結果、このコードを発見したと記されている。リンツの別の郵便局員、アレクサンダー・ヴィルヘルム・ランベルトは、1872年には既にシェフラーにこのコードを示したと主張しているが、この主張は明確ではなく、検証することはできない。[…]
(6ページ)
[…] カルノー図は、判別式の引数を、グレイコードとも呼ばれる反射二進コードに従って順序付けます。[…](xii+291+3ページ)初版
[…] Übersichtlich ist die Darstellung nach
Händler
, die sämtliche Punkte, numeriert nach dem
Gray-Code
[…], auf dem Umfeld eines Kreises anordnet.プラッツにあるすべての情報を確認してください。 […][ヘンドラーの図は、グレイコードに従って番号付けされたすべての点が円周上に配置されたもので、理解しやすい。ただし、かなりのスペースを必要とする。]
[…]
MOA-GILLHAM コードは、基本的に上記で説明したグレイ コードとよく知られている
Datex コード
の組み合わせです。Datex コードは、米国特許第
3,165,731 号
に開示されています
。この構成では、Datex コードがエンコーダの単位カウントのビットを定義し、グレイ コードが上位のデケード、10 の位、100 の位などのビットを定義します。 […]
(11ページ)
[…] Datexコードは、各桁内でO'BrienコードIIを使用し、10進数の遷移には10進数の反転値を使用します。さらに処理するには、コードを自然10進数表記に変換する必要があります。O'Brien IIコードは9の補数であるため、特に問題は生じません。10の位のコードワードが奇数を表す場合、10進数の1の位のコードワードは、4番目の2進数を反転した9の補数として与えられます。[…]
[…] 「Varec」パルスコード遠隔計測システムを設置すると、完全なディスパッチ操作、計測、および遠隔制御が単一のユニット化されたシステムに統合されます。[…]
[…] 他の形式のコードもよく知られています。これらには、英国王立レーダー研究所コード、エクセス3十進コード、ICAOが航空交通管制目的の自動高度伝送に推奨しているギルハムコード、ペザリックコード、国立工学研究所のレスリー・ラッセルコードなどがあります。それぞれに独自の利点があり、様々なエンコーダメーカーがオプションとして提供しています。[…](12+367+5ページ)
[…] ファーマ・ハリソン再生装置、イギリス・ファンボロー […] 英国空軍と英国産業機械のデジタイザーであるツーサムナールベイトのヤーレンレンジャー・エントウィックルングの帽子 […] zu einer technischen Reife gebracht, die fast allen Anforderungen […] ゲンニュグト。 […] Um bei der dezimalen Entschlüsselung des verwendeten Binärcodes zu eindeutigen und bei der Übergabe von einer Dezimalstelle zur anderen in der Reihenfolge immer richtigen Ergebnissen zu kommen, wurde ein spezieller Code entwickelt, derフェーラーウセージは、主要な青少年を対象とし、相対的な評価を得ることができます。
Petherick-Code
を使用したコードの作成
。 […]
(4ページ)