格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印格雷码序列。格雷码序列必须以 0 开头。
例如,给定 n = 2,返回 [0,1,3,2]
。其格雷编码是:
00 - 0 01 - 1 11 - 3 10 - 2
解题思路:
二进制码转换成二进制格雷码,其方法是二进制码的最高位不变,其余位与其前一位做异或运算。
如二进制码0010
第4位0与第3位1异或的1;
第3位1与第2位0异或的1;
第2位0与第1位0异或的0;
第1位保持不变,任然为0;
故其对应的二进制格雷码位0011 。
对于整数i,求其对应的格雷码,可使用上述方法,i的格雷码为i^(i>>1) 。(无需将i转换为二进制码)
^为异或运算,>>为右移一位。
i的每一位与前一位做异或运算就等价于i与i右移一位的结果做异或运算。
实现代码如下:
public static List<Integer> test(int n) { List<Integer> list = new LinkedList<>(); int N = 1<<n; for (int i=0; i<N; i++) list.add(i ^ (i>>1)); return list; }
posted on 2018-06-12 20:11 Deltadeblog 阅读(2225) 评论(0) 编辑 收藏 举报