Hatena::ブログ(Diary)

@a4lg のそろそろ技術的日記 Twitter

2012-01-05

グレイコード→次のグレイコード的なカウンタ

@ さんがつぶやいた、グレイコードを直接出すカウンタは…できました。けど複雑な上に実質加算器なので、個人的にはこれはあまり好きになれません。

グレイコードとは

グレイコードとは、1 ステップ進めると 1 ビットだけ変化するという性質を持つ n ビットの数値符号です。ここでは、3 ビットのグレイコードを見てみましょう。

vb2b1b0
0000
1001
2011
3010
4110
5111
6101
7100

C 言語では、次の関数グレイコードに変換できます。

int graycode(int v)
{
    return v ^ (v >> 1);
}

「上位のビットに」依存するグレイコード

上の関数は、通常の数値からグレイコードを生成します。では、グレイコードから次のグレイコードを生成できるのか? というのが @ さんの疑問だったみたいです。でまぁ…卑怯ですが、できました。

  • 各ビットは、「自ビットより上位ビットすべての偶数パリティ」=P、「自ビット」=Bin、「キャリー」=Cin を受け取る
  • 各ビットはキャリーが 1 のときにしか更新されない
  • 最下位ビットのキャリーは、通常の加算器と異なり常に 1 (最下位ビットから更新が始まる)
  • 各ビットは出力の自ビット=Bout、キャリー=Cout を出力し、Cout はすぐ上のビットの Cin になる

このとき…

CinPBinBoutCout
0XXBin0
10010
10111
11001
11100

もっと省略すると、

CinPBinBoutCout
0XXBin0
1XX~PP^Bin

ただしこれは最上位ビットを除く話です。最上位ビットの場合には、0→1 のとき上記ルールが適用できますが、1→0 のときルールが適用できません。そのため、Cin=1, Bin=1 で、かつ下位ビットすべてが 0 ならば、Bout は 0 にする必要があります。

ビット毎に計算して正しいことを確かめてみてください。

各ビット毎のパリティをあらかじめ求めておく必要はあるものの、これで一応はグレイコード→次のグレイコードが一意に算出できます。だけどこれって加算器を変形しただけだから、実質バイナリ (数値) 変換してるのと変わらないのよね…。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/a4lg/20120105/1325764810