> グレイ | 反射 | 2進 <
// グレイコード - 連続する値の間で1ビットだけが変化する2進数体系
ユニットディスタンス
連続する値の間で変化するのは常に1ビットだけです。
エラー低減
アナログ-デジタル変換時の誤りを減らします。
循環特性
最初と最後の値も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コンバータなど、多くの分野で利用されています。
// クイックリファレンス
| Dec | Binary | Gray |
|---|---|---|
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | 100 |
// コード例
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) です。