格雷編碼


格雷編碼是一個二進制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。

給定一個代表編碼總位數的非負整數 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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM