格雷码生成程序

一、复习数电的时候碰到了格雷码,已知其有循环特性及单步特性,于是观察格雷码的生成有什么规律。由观察结果得到格雷码的递推生成方法:

1-bit码为: 0 1 
2-bit码即为增加一个高位,它可能是0或1,格雷码先0后1;为使其符合格雷码的特性,当高位为0时所有低位与1-bit一致,当高位为1时所有低位应为1-bit的逆序,即: 
高位为0 | 高位为1 
00     01 | 11    10 
由此规则可递推生成任意位元的格雷码。

顺着这个思路我写了个程序,如下:

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

void gen_graycode(int n){
    int x=pow(2,n); //计算编码个数
    string* s=new string[x];    //用字符串来存储编码
    for(int i=0;i<x;i++) s[i]="";   //初始化为空字符串

    s[0]+='0';  //1-bit格雷码
    s[1]+='1';


    int m=2;
    while(m<x){     //循环扩展已有编码
        int i=m, j=m;
        for(;i>0;i--,j++){
            s[j]+=s[i-1];   //将低位码的逆序赋值给扩展的新编码
            s[j]+='1';      //扩展的新编码高位为1
        }
        for(i=0;i<m;i++)
            s[i]+='0';      //旧编码也相应扩展,高位为0
        m*=2;       //编码个数翻倍
    }

    for(int i=0;i<x;i++){   //打印结果
        for(int j=n;j>0;j--)
            cout<<s[i][j-1];    //注意是先进先出的
        cout<<endl;
    }
}

int main(){
    for(int i=1;i<=5;i++){
        cout<<i<<"-bit gray code:"<<endl;
        gen_graycode(i);
        cout<<endl;
    }
    return 0;
}

打印结果为:

1-bit gray code:
0
1

2-bit gray code:
00
01
11
10

3-bit gray code:
000
001
011
010
110
111
101
100

4-bit gray code:
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000

5-bit gray code:
00000
00001
00011
00010
00110
00111
00101
00100
01100
01101
01111
01110
01010
01011
01001
01000
11000
11001
11011
11010
11110
11111
11101
11100
10100
10101
10111
10110
10010
10011
10001
10000


Process returned 0 (0x0)   execution time : 1.054 s
Press any key to continue.


二、再进一步提炼规律,就可得出格雷码的反射规律:

对于n-bit格雷码,若称其最低位为第一位,则:
第一位为01的反射序列,即01100110... (最左边为第一个编码的第一位,次之为第二个编码的第一位),可这样看: 01 | 10 | 01 | 10 ... 
第二位为0011的反射序列,即0011 1100 0011 1100...
第三位为00001111的反射序列,以此类推。

利用这个规律可以判断第i个编码的第j个位应是0还是1,故可直接逐个打印。程序如下:

#include <iostream>
#include <cmath>
using namespace std;

void gen_graycode(int n){
    int x = pow(2,n); //计算编码个数
    for(int i=0;i<x;i++){
        for(int j=n;j>=1;j--){  //从最高位开始打印
            int y = i / (int)pow(2,j);
            int k = i % (int)pow(2,j);
            if(y%2==0){ //第偶数个反射即为先0后1
                if(k<pow(2,j-1)) cout<<'0'; //先0
                else cout<<'1'; //后1
            }
            else{   //第奇数个反射即为先1后0
                if(k<pow(2,j-1)) cout<<'1'; //先1
                else cout<<'0'; //后0
            }
        }
        cout<<endl;
    }
}

int main(){
    for(int i=1;i<=5;i++){
        cout<<i<<"-bit gray code:"<<endl;
        gen_graycode(i);
        cout<<endl;
    }
    return 0;
}

第一次debug的时候,Line 10没有用(int)强制转换报错。

输出结果为:

1-bit gray code:
0
1

2-bit gray code:
00
01
11
10

3-bit gray code:
000
001
011
010
110
111
101
100

4-bit gray code:
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000

5-bit gray code:
00000
00001
00011
00010
00110
00111
00101
00100
01100
01101
01111
01110
01010
01011
01001
01000
11000
11001
11011
11010
11110
11111
11101
11100
10100
10101
10111
10110
10010
10011
10001
10000


Process returned 0 (0x0)   execution time : 0.499 s
Press any key to continue.

你可能感兴趣的:(code,格雷码,gray)