Kod Graya
Kod Graya służy do zapisywania liczb binarnie. Jest kodem binarnym, bezwagowym,  niepozycyjnym i cyklicznym. 
Kodu Graya używa się w przetwornikach analogowo - cyfrowych, zwłaszcza w systemach, gdzie występują po sobie kolejne wartości, np. czujniki położenia i obrotu w robotyce, w kombinatoryce (grafy) oraz przy etykietowaniu pojedynczych procesów (wierzchołków) w sieci będącej hiperkostką, czyli systemem wieloprocesorowym o architekturze przełączanej, który tworzy topologiczny n-wymiarowy sześcian.
Kodem Graya długości n jest ciąg wszystkich 2n ciągów n cyfr{0, 1} ustawionych tak, że dwa kolejne ciągi cyfr różnią się dokładnie jedną z nich , w tym również słowo ostatnie z pierwszym.
Tworzenie kodu
Aby zbudować kod musimy znać liczbę bitów. 

Kod 1-bitowy ma 21 słów: {0, 1}
	A. Mamy 				{0, 1} 
	B. Tworzymy lustrzane odbicie         {1, 0}
	C. Do A dodajemy 0 i otrzymujemy {00, 01}
	D. Do B dodajemy 1 i otrzymujemy {11, 10}
	E. Łączymy C i D i otrzymujemy {00, 01, 11, 10} czyli 2-bitowy kod Graya.
	
Kod 2-bitowy ma 22 słów: {j.w.}
Czynności powtarzamy i otrzymujemy 3-bitowy kod Graya który ma 23 słów:
{000, 001, 011, 010, 110, 111, 101, 100}

etc., etc., etc.
Algorytm

public static String[] grays(int bitsNum) {
	String[] strs = new String[(int)Math.pow(2, bitsNum)];
	for(int i = 0; i < strs.length; i++){
		strs[i] = decToGray(i);
	}
	return strs;
};

Kod 4-bitowy (24 słów) (Plik: Gray01.java):

(liczba)10	(liczba)2	(liczba)gray
 0 		  0000		  0000
 1 		  0001 	  0001
 2 		  0010		  0011
 3 		  0011         0010
 4 		  0100		  0110
 5 		  0101 	  0111
 6 		  0110		  0101
 7 		  0111 	  0100
 8 		  1000 	  1100
 9 		  1001 	  1101
10 		  1010 	  1111
11 		  1011		  1110
12 		  1100 	  1010
13 		  1101         1011
14 		  1110 	  1001
15 		  1111 	  1000

Kod 5-bitowy - 25 słów (Plik: Gray02.java).
[0, 1, 11, 10, 110, 111, 101, 100, 1100, 1101, 1111, 1110, 1010, 1011, 1001, 1000, 11000, 11001, 11011, 11010, 11110, 11111, 11101, 11100, 10100, 10101, 10111, 10110, 10010, 10011, 10001, 10000]

Na konsoli liczby drukowane są bez czołowych zer. Gdybyś potrzebował tych zer możesz łatwo przekształcić kod dodając z przodu brakujące zera.
Konwersja liczb dziesiętnych do kodu Graya
Algorytm
public static String decToGray(int dec) {
	int gr1 = dec ^ (dec >> 1);
	return Integer.toString(gr1, 2);
}

Plik: Gray03.java.

 
Konwersja liczb binarnych do kodu Graya
1.	Przesunąć liczbę binarną o jeden bit w prawo (podzielić przez 2)
2.	Wykonać operację XOR na odpowiednich bitach liczby i wyniku dzielenia przez 2.
Algorytm

public static String binToGray(String bin) {
	int gr = Integer.parseInt(bin, 2);
	int gr1 = gr ^ (gr >> 1);
	return Integer.toString(gr1, 2);
}

Plik: Gray04.java.

 
Konwersja kodu Graya na liczby dziesiętne
Algorytm

public static int grayToDec(String gray) {
	StringBuilder sb = new StringBuilder();
	String a = gray.substring(0, 1);
	sb.append(a);
	for(int i = 1; i < gray.length(); i++){
		int g = Integer.parseInt(a)
				^ Integer.parseInt(gray.substring(i, i + 1));
		a = Integer.toString(g);
		sb.append(Integer.toString(g));
	}
	return Integer.parseInt(sb.toString(), 2);
}

Plik: Gray05.java.

 

Konwersja kodu Graya na liczby binarne
1.	Pobierz pierwszą (najbardziej znaczącą) cyfrę kodu Graya i ustanów ją pierwszą (najbardziej znaczącą) cyfrą liczby binarnej
2.	Każdą kolejną cyfrę oblicz jako XOR wyznaczonej poprzednio liczby binarnej i następnej cyfry kodu Graya

Lp.	Kod Graya	XOR	Kod binarny	XOR
1	1010		1___	
2	1010	1^0=1	11__	
3	1010	1^1=0	110_	
4	1010	0^0=0	1100	
Algorytm

public static String grayToBin(String gray) {
	StringBuilder sb = new StringBuilder();
	String a = gray.substring(0, 1);
	sb.append(a);
	for(int i = 1; i < gray.length(); i++){
		int g = Integer.parseInt(a)
				^ Integer.parseInt(gray.substring(i, i + 1));
		a = Integer.toString(g);
		sb.append(Integer.toString(g));
	}
	return sb.toString();
}

Plik: Gray06.java.

 

