格雷码

问题描述

递归和非递归生成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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值