格雷码

来源:互联网 发布:淘宝男士护肤 编辑:程序博客网 时间:2024/05/22 17:30

问题描述

递归和非递归生成N位格雷码

问题解析

什么是格雷码?

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
这里写图片描述

参考代码

递归

http://blog.csdn.net/beiyeqingteng/article/details/7044471

基于格雷码是反射码
1位格雷码有两个码字;n+1位格雷码的集合 = n位格雷码集合(顺序)加前缀0 + n位格雷码集合(逆序)加前缀1

package xianggen.others;import java.util.Scanner;/** *  * GrayCode.java * @author xianggen * @date 2016年8月1日 上午10:02:03 */public class GrayCode {    public static void main(String[] args) {        int n;        String[] result;        Scanner scan=new Scanner(System.in);        while(scan.hasNext()){            n=scan.nextInt();            result=grayCode(n);            display(result);        }    }    /**     * 搞懂递归     * @param n     * @return     */    public static String[] grayCode(int n){        String[] graycode=new String[(int) Math.pow(2, n)];        if(n==1){            graycode[0]="0";            graycode[1]="1";            return graycode;        }        String[] last=grayCode(n-1);        for(int i=0;i<last.length;i++){            graycode[i]="0"+last[i];            graycode[graycode.length-1-i]="1"+last[i];        }        return graycode;    }    public static void display(String[] astr){        for(int i=0;i<astr.length;i++)            System.out.println(astr[i]);    }}

异或转换

根据对应的n位二进制码直接得到n位格雷码码字

  1. 对n位二进制的码字,从右到左,以0到n-1编号
  2. 如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变);
    公式:G(n) = B(n) XOR B(n+1)
/**     * 非递归     * @param n     */    public static void getGrayCode(int n){        for(int i = 0; i < (int)Math.pow(2, n); i++){            int grayCode = (i >> 1) ^ i;            System.out.println(num2Binary(grayCode, n));        }    }    public static String num2Binary(int num, int n){        String ret = "";        for(int i = n-1; i >= 0; i--){            ret += (num >> i) & 1;            System.out.println(": "+ret);        }        return ret;    }
0 0