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

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);
    }
}
posted @ 2018-05-05 22:41  birchtree  阅读(788)  评论(0编辑  收藏  举报