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);
        }
    }
  • 相关阅读:
    「ROI 2019 Day1」运输 20/19
    「ROI 2018 Day 2」无进位加法
    「ROI 2018 Day 1」量子隐形传态
    「ROI 2018 Day 2」快速排序
    「ROI 2018 Day 1」Innophone (分块+斜率优化)
    「ROI 2017 Day 1」虎 (计算几何)
    [BJ United Round #3] 押韵 [学习笔记]
    「CEOI2020」象棋世界
    CF1375G
    CF1392(div1+div2)
  • 原文地址:https://www.cnblogs.com/birchtree/p/9845847.html
Copyright © 2011-2022 走看看