格雷編碼是一個二進制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數 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; }