グレイコード、バイナリ、BCD

ここでいうバイナリって要するに「二進数」のこと。コンピュータによる演算が簡単。

BCDは、Binary-coded decimalの略。日本語では「二進化十進数」という。「二進数」を4桁(4bit)毎に区切って、それぞれに0~9の重みをつけて数値を表現する方式。昔のリレー式計算機などでは内部コードとしても使われていたみたいです。今でも10進数の桁単位で取り出しが可能なため、7セグメント表示機やデジスイッチとのインタフェイスに使ったりする。「二進数」に比べれば人間にもわかり易いよね。
ただ、16進でいうところのA~Fの部分を捨てて利用するわけだから、情報密度が下がって勿体無い。たとえば16bitあったとき、バイナリなら0〜65535を表現できるけど、BCDでは0〜9999しか表現できないのです。
これはタダの愚痴ですが、オムロンのPLCが未だに内部演算でBCDを利用する命令があり、判りにくいことこの上ない。歴史のあるメーカさんは大変だね。

グレイコードは、アメリカのグレイさんが発明したもの。日本語では「交番二進符号」かな。情報密度はバイナリと一緒。16bitあったら0〜65535を表現できる。
これの特徴は、±1の増減をするとき、1bitしか変化しない。という点。wikipediaの解説が素晴らしかったので引用させてもらうと

グレイコードは、ある値から隣接した値に変化する際に、常に1ビットしか変化しないという点が利用される。

一般的な2進数では、隣接する値に移行する際に変化するビットの数は1以上である。たとえば3から4に変化する場合、2進数だと011から100に、3ビットの変化が起こる。

絶対的な角度をデジタル値で出力するアブソリュート・ロータリー・エンコーダーのような機器において、機械的な接点などで電気信号のオンオフを行い、このような2進数形式でのデータ出力を行った場合について考えてみよう。この場合、機械の動作やデータ読み出しのタイミングによっては、誤ったデータが得られる可能性がある。たとえば011から100に変化する際に、短時間の間に次のように出力が遷移するかもしれない。

011 → 010 → 000 → 100

各ビットとも、変化に誤りはないのであるが、機械構造の精度上の問題で、完璧に同時に全ビットが変化することは保証できないのである。そのため遷移の途中の段階でデータを読み出すと、010(2)や000(0)といった偽データを取得してしまう可能性がある。

一般的な2進数ではなく、グレイコードを使えば、隣接値への変化の際に、常に1ビットしか変わらないので(3から4の変化であれば010から110)、いかなるタイミングで読み出そうとデータの値は以前の値か次の値であり、偽データが生成されることはない。

ってな具合です。そんなわけで、アブソリュートエンコーダ、日本語で言うなら絶対値出力型位置検出器あたり? とのインタフェイスに使われます。これのバイナリ列はコンピュータにとっても人間にとっても計算しにくいので、インタフェイスが済んだらさっさとバイナリに変換して使います。
グレイコードのまま四則演算できる仕組みを考案して論文書けたらもう立派な数学者なんじゃないかと思いますけど、実世界にはな〜んの恩恵もありません。(苦笑) 数学者って大変そうだな。と思える一例です。

ちなみにロータリーエンコーダで、分解能8bitの場合、最大値の255から0に戻るときも、1bitしか変化しないよ。よく出来てるねぇ。
さらに、256分割じゃ使いづらい、360分割してくれよ。と9bitにして360分割する場合、76余りグレイを使う。76から435を出力してもらうわけ。コード表を見たときはおどろいたよ。賢い人がいるんだねぇ。


二進化十進表現 - Wikipedia
http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E5%8C%96%E5%8D%81%E9%80%B2%E8%A1%A8%E7%8F%BE

グレイコード - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%A4%E3%82%B3%E3%83%BC%E3%83%89

ラダー書きさんはこちらへ。素晴らしいかも。
回路集 - TaizouKun brand office.
http://www.d1.dion.ne.jp/~taizou/workshop/plc/ladder/3.html