zoukankan      html  css  js  c++  java
  • 浅谈格雷码(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);
        }
    }
  • 相关阅读:
    shell(计算机壳层)(二)
    Linux Bash Shell快速入门 (三)
    Lua
    bash
    Perl
    脚本语言
    JSP中获取客户端或浏览端信息的方式
    linux环境变量
    逆向思维
    【maven】IDEA:存在jar包,pom.xml文件没报错,但是Maven-Project-Dependencies有红线报错
  • 原文地址:https://www.cnblogs.com/birchtree/p/9845847.html
Copyright © 2011-2022 走看看