28.Algorithmゴシップ:グレイコード(グレイコード)
説明
グレイコード列のセットの数であり、バイナリを表すために使用されるビットの数の各々は、数Nビットの各ウェルを表現するために、任意の2つの数の間だけ異なるビット値は、例えば、灰色を3ビットと仮定されますコード:
000 001 011 010 110 111 101 100
定義では知っている可能性があり、グレイコードの順序は、書き込みに順番に列数が、また、グレイコードのセット、上記の一例に過ぎません。
100 101 111 110 010 011 001 000
フランク・グレイグレイコードは、PCM(Pusle符号変調)信号伝送方式を使用するときにミスを避けるために、1940年代にベル研究所で上昇し、1953年3月17日に米国特許を取得しました。
ソリューション
2ビットの数との間の隣接するグレイコードのみが変化するので、次のように与えられ、変更時に1から0又は0から1に4ビットのグレイコードをグレイコードを観察することが可能です。
0000 0001 0011 0010 0110 0111 0101 0100
1100 1101 1111 1110 1010 1011 1001 1000
奇数用語で観測された変化は、我々は、それが1から0であれば、それは、1〜0の場合は永遠に、唯一の右端のビットを変更し、いくつかのグレイコードの最初のものであるかどうかを見つけるとき。
で観測された変化は、偶数番目の場合、我々は、変更ビットは、最初のビット1の左側に右であると考えられることを見出しました。
二つ以上の変化規則にかかわらず、そのビット数の、固定されている。限りビット位置決定のように配列インデックス0、利便性をプログラミング書き込むために、ビットの値を変更することを決定することができる、奇数または偶数であるように右端の値、および印刷結果に、大きな数字は、インデックスプリントで逆転し始めました。
2ビットのグレイコードの座標平面として、だから、頂点座標の集合がグレイコードであり、それを通して四角形境界の周囲からの任意の頂点を見つけることができ、四角形を構成することができますあなたは4グレイコードを得ることができます。
すべての辺の長さを介して任意の頂点から開始することができるならば頂点があれば繰り返さない後のビューの平面座標は、後に、正立方体を構成することができるように3ビットのグレイコードの同じ頂点座標の組み合わせは、連続グレイコードのセットです。
サンプルコード
#include <stdio.h>
#include <stdlib.h>
#define MAXBIT 20
#define TRUE 1
#define CHANGE_BIT(x) x = ((x) == '0' ? '1' : '0')
#define NEXT(x) x = (1 - (x))
int main(void) {
char digit[MAXBIT]; int i, bits, odd;
printf("输入位元数:"); scanf("%d", &bits);
for(i = 0; i < bits; i++) { digit[i] = '0';
printf("0");
}
printf("\n"); odd = TRUE; while(1) {
if(odd)
CHANGE_BIT(digit[0]);
else {
// 计算第一个1的位置
for(i = 0; i < bits && digit[i] == '0'; i++) ; if(i == bits - 1) // 最后一个Gray Code
break; CHANGE_BIT(digit[i+1]);
}
for(i = bits - 1; i >= 0; i--)
printf("%c", digit[i]);
printf("\n"); NEXT(odd);
}
return 0;
}