以下のデジタル回路の問題をやってみる。続き。
- Q: グレイコード11001をバイナリコードに変換してください。
やり方としては、まずMSBの1を保持し、上位ビットから順番に次のビットとのXORを取っていく。
4 3 2 1 0 // bit-position 1 1 0 0 1 // オリジナルグレイコード 1 0 0 0 1 // bit[4]^bit[3] = 0 1 0 0 0 1 // bit[3]^bit[2] = 0 1 0 0 0 1 // bit[2]^bit[1] = 0 1 0 0 0 1 // bit[1]^bit[1] = 1
というように変換する。これが成立する理由としては、グレイコード自体が、ビットの変化がたかだか1ビットしか変更しないというルールを適用する必要があるためだ。
逆に、2進数からグレイコードに変換するときは、
通常の二進表現をグレイコードに変換するには、「対象の二進表現」と、「それを1ビット右シフトし、先頭に0をつけたもの」との排他的論理和をとる。
これは、隣のビットとの変化を見つけていることに相当する。うまく理論的に説明できないが、これでうまく動作するのはなんとなく感覚で分かる。
2進数 0 0 0 0 0 : 00000 ^ 00000 = 00000 0 0 0 0 1 : 00001 ^ 00000 = 00001 0 0 0 1 0 : 00010 ^ 00001 = 00011 0 0 0 1 1 : 00011 ^ 00001 = 00010 0 0 1 0 0 : 00100 ^ 00010 = 00110 0 0 1 0 1 : 00101 ^ 00010 = 00111