格雷码
来源:互联网 发布:淘宝男士护肤 编辑:程序博客网 时间: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位格雷码码字
- 对n位二进制的码字,从右到左,以0到n-1编号
- 如果二进制码字的第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
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 格雷码
- 重学 Statistics, Cha16 General Linear Model
- HDOJ 5744 Keep On Movin(回文串)
- django学习笔记二
- HDOJ 5753 Permutation Bo(排列组合)
- python高级编程
- 格雷码
- django学习笔记三
- HDOJ 5774 Where Amazing Happens(人肉搜索)
- Popular Products_太阁竞赛B
- JComboBox默认不选中任何选项的方法
- 2N的数组分割成两个和最接近的子数组
- 如何在c++中调用java代码
- Gulp-前端进阶A-2
- RxJava新手入门之二 快捷发送事件just方法使用以及from拆分数组发送事件方法详解