グレイコードとは

グレイコード(別名:交番二進符号)は2進数の表現方法のひとつで、値を1変化させた場合は、1桁のみ変化するようになっています。

並び

通常の2進数と違い並びがごちゃごちゃしているように見えますが、法則性があります。上下を比べてみると変化するビットが1つに抑えられているのが分かります。

利点

応用例はいくらでもあるそうですが、エンコーダなどのセンサー類の出力でよくみかけます。

センサなど値が絶え間なく変わっていく信号を出力または読み取る際、電気素子の遅れにより前回読み取った値が現在読み取った値と混ざることがあります。

4bitの信号で最も位の高い桁(MSB)の読み取りが遅れる場合を例に考えてみましょう。

信号が7(0b0111)から8(0b1000)へ変化しています。

しかし最も高い桁が遅れて読み取られることにより、信号が8(0b1000)になりきるまでの間0(0b0000)になってしまいます。何らかの対処をしなければ合間に現れる0が測定エラーを引き起こしてしまいます。

 

この問題に対処するためグレイコードを利用してみましょう。

先ほどと同じように信号が7(0b0100)から8(0b1100)へ変化しています。最も高い桁が遅れて読み取られても1bitしか変化がないため信号が変わっている途中でも7が読み取られます。

”信号が変化していくタイミングで本来ありえない値の読み取りを防ぐ”これがグレイコードを使う利点です。

生成方法

2進数からグレイコードを生成してみましょう。

変換したい2進数と1bit右シフトしたものをXORさせることで生成できます。

bin ^ (bin >> 1);

復元方法

グレイコードから2進数へ戻してみましょう。

元のコードを1bit右シフトしたものを元のコードとXORしていきます。右シフトしたものが0になるまで繰り返します。

i = gray >> 1;
while(1){
    gray = gray ^ i;
    i = i >> 1;
    if(i == 0){
        break;
    }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)