格雷码 Gray

来源:互联网 发布:sql 用变量作为字段名 编辑:程序博客网 时间:2024/06/05 10:52

格雷码 Gray


格雷码定义: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)


格雷码的求解: 上一次求解到的Gray码, 按顺序给每一个都加上前缀0,  得到前一半,然后,将Gray码逆序,给每一个都加上前缀1就是答案。

例如: 

n = 1 

Gray: 0 1

n = 2

  00  01  (顺序 0 1)

  11  10  (逆序 1 0)


具体代码


#include <bits/stdc++.h>using namespace std;// Gray(n) = 前缀0 + 顺序Gray(n-1)  前缀1 + 逆序Gray(n-1)void getGrayCode(int arr[], int n){    if (n==1)    {        arr[1] = 0;        arr[2] = 1;        return;    }    // 获取 n-1 的格雷码    getGrayCode(arr, n-1);    int k = 1<<(n-1);    for(int i=k; i>0; i--)    {        // 逆袭加前缀        arr[2*k+1-i] = arr[i]+k;    }}void printGrayCode(int arr[], const int n){    for(int i=1; i<=(1<<n); ++i)    {        //printf("%d\n", arr[i]);        bitset<4> bit(arr[i]);        cout<<bit<<" ";        if ( i==(1<<(n-1)) )    // 一半时候进行换行            cout<<endl;    }    printf("\n");}int main(void){    int n = 4;    int *code = new int[1<<10];    getGrayCode(code, n);    printGrayCode(code, n);    return 0;}



1 0