Gray码又称二进制循环码,简单说就是任意两个相邻的代码只有一位不同。
一个n位的二进制码是由 2^n个Gray码构成的一个集合。
格雷码的编码规律是:
第一步,改变最右边的位元值;
第二步,改变右起第一个为1的位元的左边位元;
第三步,重复第一步和第二步,直到所有的格雷码产生完毕,即生成了2^n个n位的二进制码。
举栗子:
n = 0 编码:0
n =1 编码:0 1
n = 2 编码:00 01 11 10
n = 3 编码: 000 001 011 010 110 111 101 100
但是按这个规则编程并不简单,观察观察下图会发现,除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推
。
递归实现
class GrayCode {
public:
vector<string> getGray(int n) {
int m = pow(2,n);
vector<string>str(m);
if(n<1)return {};
if(1==n){
str[0]="0";
str[1]="1";
return str;
}
vector<string>pre_gray = getGray(n-1);
for(int i=0;i<pre_gray.size();i++){
str[i]="0" + pre_gray[i];
str[m-1-i]="1" + pre_gray[i];
}
return str;
}
};
非递归实现:
vector<int> grayCode(int n) {
vector<int>res;
for(int i=0;i<(1<<n);i++){
res.push_back(i^(i>>1));
}
return res;
}