格雷编码

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 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;
    }
原文地址:https://www.cnblogs.com/deltadeblog/p/9174869.html