浅谈格雷码(Grey Code)在信息学竞赛中的应用

1.格雷码的概念

1.性质

格雷码(Grey Code),又叫循环二进制码或反射二进制码,是一种编码方式,它的基本特点是任意两个相邻的格雷码只有一位二进制数不同。

常用的二进制数与格雷码间的转换关系如下表:

浅谈格雷码(Grey Code)在信息学竞赛中的应用

从表中我们可以发现任意两个相邻的格雷码只有一位二进制数不同

2.转换方法

二进制数转格雷码的方法如下:

从左到右,每一位的格雷码值等于该位的二进制值异或(XOR)上该位左边一位的二进制值。特别地,最左边一位的格雷码值等于二进制值。

鉴于有些读者可能对异或不熟悉,这里给出异或的对照表

浅谈格雷码(Grey Code)在信息学竞赛中的应用

如: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);
}
}
上一篇:201521123008《Java程序设计》第七周实验总结


下一篇:如何将一个Excel文件中的sheet移动到另外一个Excel?