1.格雷码的概念
1.性质
格雷码(Grey Code),又叫循环二进制码或反射二进制码,是一种编码方式,它的基本特点是任意两个相邻的格雷码只有一位二进制数不同。
常用的二进制数与格雷码间的转换关系如下表:
从表中我们可以发现任意两个相邻的格雷码只有一位二进制数不同
2.转换方法
二进制数转格雷码的方法如下:
从左到右,每一位的格雷码值等于该位的二进制值异或(XOR)上该位左边一位的二进制值。特别地,最左边一位的格雷码值等于二进制值。
鉴于有些读者可能对异或不熟悉,这里给出异或的对照表
如:0100
从左到右分别编为1,2,3,4位
第1位0,保持不变
第2位1,左侧为0, 1 XOR 0=1
第3位0 ,左侧为1, 0 XOR 1=1
第4位0,左侧为0, 0 XOR 0=0
所以0100 的格雷码为0110
代码实现上,为了是每一位能与它左边一位异或,我们可以直接将x异或上x>>1
如:0100,左移一位是0010
0100
0010
————
0110
求单个格雷码的代码如下
int get_grey(int x){
return x^(x>>1);
}
求0~2^n-1全部格雷码的代码如下
void get_grey(int n,int *x){
//x[i]表示i对应的格雷码
for(int i=0;i<(1<<n);i++){
x[i]=i^(i>>1);
}
}