私の一般的な考え:
1。グレイコードを生成するためにn-1ビットの配列を取得します。2。nビットによって生成されるグレイコード
の数はn-1の2倍なので、nがグレイの前半である限りコードを入力し、0を追加してから、半分に1を追加します。
各ブロガーの実装方法は次のとおりです。リンクの説明を追加して転載した
C言語グレイコードの生成
隣接するグレイコード間で異なるのは1ビットのみです。これは、変換中に複数のビットが同時に変更されることによる遅延の影響を防ぐためです。具体的な定義は次のとおりです。
数字のグループのコーディングでは、隣接する2つのコードが1つの2進数だけ異なる場合、この種のコーディングはグレイコードと呼ばれます。さらに、最大数と最小数の間に1桁しかないため、は「エンドツーエンドで接続されている」ため、サイクリックコードまたはリフレクションコードとも呼ばれます。デジタルシステムでは、コードを特定の順序で変更する必要があることがよくあります。たとえば、自然数を使用してカウントアップする場合、8421コードを使用すると、0111が1000に変わると、4桁すべてが変化します。実際の回路では、4桁の変化が完全に同時に発生することはありません。 、およびその他の短期コードがカウントに表示される場合があります(1100、1111など)。特定の状況下では、回路ステータスエラーまたは入力エラーを引き起こす可能性があります。グレイコードを使用すると、この種のエラーを回避できます。グレイコードには多くのエンコード形式があります。
設計方法:
最初のステップ:0と1の2つの文字列が生成されます。
ステップ2:最初のステップに基づいて、各文字列に0と1を追加しますが、一度に追加できるのは1つだけなので、2回追加する必要があります。これは00,01,11,10になります(対称性に注意してください)。
3番目のステップ:2番目のステップに基づいて、各文字列に0と1を追加します。同様に、一度に追加できるのは1つだけなので、000,001,011,010,110,111,101,100になります。
さて、3ビットのグレイコードが生成されます。
4ビットのグレイコードを生成する場合は、3ビットのグレイコードに0,1のレイヤーを追加するだけで済みます:0000,0001,0011,0010,0110,0111,0101,0100,1100,1101 、1110、1010、0111、1001、1000。
すなわち、nビットグレイコードは、n-1ビットグレイコードに基づいて生成される。
以下は、再帰を使用してnビットのグレイコードを生成するコードです。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 256
char GrayCode [MAX_LEN] [MAX_LEN];
// 2 ^ n
int pow(int m)
{ int i、sum = 2; if(1 == m){ return 2; } for(i = 1; i <m; i ++){ 合計* = 2; }合計を返します。}
char ** GrayCodeCreate(int n)
{ int i、j;
if(1 > n)
{
printf("Wrong!\n");
return **GrayCode;
}
else if(1 == n)
{
//printf("%d ", strlen(GrayCode[0]));
GrayCode[0][0] = '0';
GrayCode[1][0] = '1';
//printf("%d ", strlen(GrayCode[0]));
return **GrayCode;
}
GrayCodeCreate(n - 1);
for(i = pow(n) / 2 - 1, j = pow(n) / 2; i >= 0, j < pow(n); i--, j++)
{
strcpy(GrayCode[j], GrayCode[i]);
}
for(i = 0, j = pow(n) / 2; i < pow(n) / 2, j < pow(n); i++, j++)
{
GrayCode[i][strlen(GrayCode[i])] = '0';
GrayCode[j][strlen(GrayCode[j])] = '1';
}
return **GrayCode;
}
int main()
{ int i、j、n; scanf( "%d"、&n); // printf( "%d"、pow(n)); GrayCodeCreate(n); for(i = 0; i <pow(n); i ++){ for(j = strlen(GrayCode [i])-1; j> = 0; j –){ putchar(GrayCode [i] [j]); } printf(” \ n "); } 0を返します。}
グレイコードで配置できるかどうかを判断する
2つの8ビットバイナリコードが与えられた場合、2つのコードをグレイコードで連続して配置できるかどうかを判断します。別の質問方法は、2つのバイナリコードが1ビットだけ異なるかどうかです。
ちなみに、この質問を通じて、C言語でバイナリを出力する方法を学び、関連するビット演算の使用法についても確認しました。まず、バイナリコードの2つの文字列に対して排他的論理和演算^を使用して新しいバイナリコードを取得し、次にビット単位のAND演算と新しいコードに対して(1 << i)の方法で使用します。
注意すべき小さな場所があります。AND演算後の結果を直接出力することはできません。結果が0でない場合は、出力1または出力0のいずれであるかを判断する必要があります。
具体的なコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
int ShowInBinary(char term)
{ int i; int j; for(i = 7; i> = 0; i –){ j =(term&(1 << i)); if(j){ printf(“ 1”); } else { printf(“ 0”); } } printf( "\ n"); 0を返します。}
int IsGrayOrNot(char term1、char term2)
{ char ch = term1 ^ term2; int i、j、count = 0;
for(i = 7; i >= 0; i--)
{
j = ch & (1 << i);
if(1 == j)
{
count++;
}
}
if(count) return 1;
//ShowInBinary(ch);
return 0;
}
int main()
{ char term1 = 0x9d; char term2 = 0x9e;
printf("%d", IsGrayOrNot(term1, term2));
//ShowInBinary(term1);
//ShowInBinary(term2);
return 0;
}
Java言語:
public static String[] getGray(int n){
//先创建数组
int size = (int)Math.pow(2,n);
String[] arr = new String[size];
if(n == 1){
arr[0] = "0";
arr[1] = "1";
return arr;
}
//n-1时的数组
String[] pre = getGray (n-1);
for(int i = 0;i < pre.length;i++){
arr[i] = "0" + pre[i];
arr[arr.length-1-i] = "1" + pre[i];
}
return arr;
}
C ++
グレイコードの詳細な紹介とコードの実装