エンコード | デコード | 可視化

> グレイ | 反射 | 2進 <

// グレイコード - 連続する値の間で1ビットだけが変化する2進数体系

0 文字
0 文字
[SINGLE-BIT]

ユニットディスタンス

連続する値の間で変化するのは常に1ビットだけです。

[ERROR-REDUCTION]

エラー低減

アナログ-デジタル変換時の誤りを減らします。

[CYCLIC]

循環特性

最初と最後の値も1ビットだけが異なるように設計されています。

>> 技術情報

グレイコードの仕組み:

グレイコード(反射2進コード)は、連続する2つの値が常に1ビットだけ異なるように構成された2進数体系です。各ビットを直前のビットとXORすることで生成されます。この特性により、位置エンコーダやデジタルシステムでの遷移エラーを抑える用途に適しています。

グレイコードの例:

Decimal | Binary | Gray Code
0       | 0000   | 0000
1       | 0001   | 0001
2       | 0010   | 0011
3       | 0011   | 0010
4       | 0100   | 0110
5       | 0101   | 0111
6       | 0110   | 0101
7       | 0111   | 0100

注: 連続するグレイコード間では常に1ビットだけが変化します

グレイコードを使う理由:

  • ▸ロータリーエンコーダ
  • ▸カルノー図 (Karnaugh map)
  • ▸エラー訂正
  • ▸デジタル通信
  • ▸位置センサー

>> よくある質問

グレイコードとは何ですか?

グレイコードは、反射2進コードとも呼ばれる符号で、連続する値が常に1ビットだけ異なるように設計された2進コードです。遷移の途中で誤った値を読み取ってしまう問題を防ぐため、デジタルシステムで広く利用されています。

バイナリからグレイコードへはどう変換しますか?

バイナリからグレイコードへの変換手順: 1) 最上位ビット (MSB) はそのままにする、2) それ以降の各ビットについて、現在のビットと直前のビットのXORをとる。式: G[i] = B[i] XOR B[i-1]。例えば、バイナリ 1011 はグレイコード 1110 になります。

なぜエンコーダにグレイコードが適しているのですか?

通常の2進数では、7 (0111) から 8 (1000) へのように複数ビットが同時に変化することがあり、その途中の不正な状態が読み取られる可能性があります。グレイコードなら1ステップごとに1ビットしか変化しないため、ロータリーエンコーダなどでの読み取りが安定します。

グレイコードはどこで使われていますか?

グレイコードはロータリーエンコーダ、カルノー図による論理簡略化、デジタル通信におけるエラー訂正、遺伝的アルゴリズム、A/Dコンバータなど、多くの分野で利用されています。

// クイックリファレンス

DecBinaryGray
0000000
1001001
2010011
3011010
4100110
5101111
6110101
7111100

// コード例

Binary -> Gray   g = b ^ (b >> 1)
Gray -> Binary   b = g; for (m = g >> 1; m; m >>= 1) b ^= m;
Python           def to_gray(n): return n ^ (n >> 1)
                 def from_gray(g):
                     n = 0
                     while g: n ^= g; g >>= 1
                     return n
n bits           2^n codes, successive codes differ by exactly 1 bit (also 2^n - 1 -> 0)

>> その他の質問

Q: グレイコードとは何ですか?

A: グレイコード(反射2進符号)は、連続する値が1ビットだけ異なる表現です。ベル研究所のフランク・グレイが特許を取得し、循環的で、最後の値と最初の値も1ビットしか違いません。

Q: なぜロータリーエンコーダーに使われるのですか?

A: 通常の2進数では011から100のように複数ビットが同時に変わります。センサーの切り替えが完全に同期しないと、一瞬誤った値が出ます。グレイコードでは1ビットだけが変わるため、誤差は最大でも1位置です。

Q: グレイコードを2進数に変換するには?

A: 最上位ビットはそのままで、以降の2進ビットは「直前の2進ビット XOR 現在のグレイビット」です。式では b = g ^ (g >> 1) ^ (g >> 2) ^ …。2進からグレイは g = b ^ (b >> 1) です。

他の言語