二進制差異序列(格雷碼)
Description
n 位二進制差異序列是一個由2^n個整數組成的序列,其中:
每個整數都在范圍[0, 2^n - 1]內(含0和2^n - 1)
第一個整數是0
一個整數在序列中出現不超過一次
每對相鄰整數的二進制表示恰好一位不同,且
第一個和最后一個整數的二進制表示恰好一位不同
給你一個整數n,返回任一有效的n位二進制差異序列,1≤n ≤ 16
Input
輸入一個整數n
Output
輸出二進制差異序列,每個數之間空格隔開
Sample
代碼
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int powN = (int) Math.pow(2, n);int[] grayCode = new int[powN];for (int i = 0; i < powN; i++) {grayCode[i] = toGrayCode(i);System.out.print(grayCode[i] + " ");}}public static int toGrayCode(int i) {return i ^ (i >> 1);}}
思路
首先,n位對應的格雷碼不止一個
因此只需要找到一個格雷碼輸出即可
格雷碼跟8421碼一樣,也是一種對數字進行二進制編碼的方法,只是編碼方法跟常見的8421二進制編碼方法不一樣。
例如:
n = 3 的 8421 編碼和選取的一組格雷碼
可以通過這組觀察出特殊的規律
1、8421碼最左邊一位不變,保留下來成為格雷碼的最左邊一位;
2、從左邊第二位開始,將8421碼的每一位與它左邊的一位相 異或 得到對應位的格雷碼;
3.也就是將其與其右移一位進行異或操作(正數右移左補0)
因此可以采取
/**
*i指0-2^n數字
*/
int graycode = i ^ (i >> 1);