Szary kod - Gray code

Kod Lucala
5 4 3 2 1
Szary kod
4 3 2 1
0 0 0 0 0 0
1 0 0 0 1 1
2 0 0 1 1 0
3 0 0 1 0 1
4 0 1 1 0 0
5 0 1 1 1 1
6 0 1 0 1 0
7 0 1 0 0 1
8 1 1 0 0 0
9 1 1 0 1 1
10 1 1 1 1 0
11 1 1 1 0 1
12 1 0 1 0 0
13 1 0 1 1 1
14 1 0 0 1 0
15 1 0 0 0 1

Odzwierciedlenie kod binarny ( RBC ), znany także jako po prostu odzwierciedlenie binarny ( RB ) lub kodu Grey po Frank Gray , jest kolejność binarnym systemie liczbowym taki sposób, że dwie kolejne wartości różnią się tylko jeden bit (cyfra binarna).

Na przykład, reprezentacja wartości dziesiętnej „1” w systemie binarnym to zwykle „ 001 ”, a „2” to „ 010 ”. W kodzie Graya te wartości są reprezentowane jako „ 001 ” i „ 011 ”. W ten sposób zwiększenie wartości z 1 do 2 wymaga zmiany tylko jednego bitu zamiast dwóch.

Szare kody są szeroko stosowane w celu zapobiegania fałszywym sygnałom wyjściowym z przełączników elektromechanicznych oraz w celu ułatwienia korekcji błędów w komunikacji cyfrowej, takiej jak cyfrowa telewizja naziemna i niektóre systemy telewizji kablowej .

Motywacja i imię

Wiele urządzeń wskazuje pozycję poprzez zamykanie i otwieranie przełączników. Jeśli to urządzenie wykorzystuje naturalne kody binarne , pozycje 3 i 4 są obok siebie, ale wszystkie trzy bity reprezentacji binarnej różnią się:

Dziesiętny Dwójkowy
... ...
3 011
4 100
... ...

Problem z naturalnymi kodami binarnymi polega na tym, że przełączniki fizyczne nie są idealne: jest bardzo mało prawdopodobne, aby przełączniki fizyczne zmieniały stany dokładnie synchronicznie. W przejściu pomiędzy dwoma stanami przedstawionymi powyżej, wszystkie trzy przełączniki zmieniają stan. W krótkim czasie, gdy wszystkie się zmieniają, przełączniki będą odczytywać fałszywą pozycję. Nawet bez odbicia klawiszy przejście może wyglądać jak 011001101100 . Gdy przełączniki wydają się znajdować w pozycji 001 , obserwator nie może stwierdzić, czy jest to „rzeczywista” pozycja 1, czy stan przejściowy między dwoma innymi pozycjami. Jeśli dane wyjściowe trafiają do systemu sekwencyjnego , prawdopodobnie poprzez logikę kombinacyjną , wówczas system sekwencyjny może przechowywać fałszywą wartość.

Ten problem można rozwiązać, zmieniając tylko jeden przełącznik na raz, więc nigdy nie ma niejednoznaczności pozycji, co powoduje, że kody przypisują każdemu z sąsiednich zestawów liczb całkowitych lub każdemu członkowi listy kołowej słowo symboli, takie jak że żadne dwa słowa kodowe nie są identyczne i każde dwa sąsiednie słowa kodowe różnią się dokładnie jednym symbolem. Kody te są również znane jako kody odległości jednostkowej , pojedynczej odległości , jednoetapowe , monostroficzne lub synkopowe , w odniesieniu do odległości Hamminga równej 1 między sąsiednimi kodami.

Patent Graya wprowadza termin „odbity kod binarny”

W zasadzie może istnieć więcej niż jeden taki kod dla danej długości słowa, ale termin kod Graya został po raz pierwszy zastosowany do określonego kodu binarnego dla nieujemnych liczb całkowitych, kodu Graya z odbiciem binarnym lub BRGC . Badacz Bell Labs, George R. Stibitz, opisał taki kod we wniosku patentowym z 1941 r., przyznanym w 1943 r. Frank Gray wprowadził termin „ odbity kod binarny” w swoim zgłoszeniu patentowym z 1947 r., zauważając, że kod „nie ma jeszcze rozpoznanej nazwy”. Nazwał ją faktem, że „może być zbudowany z konwencjonalnego kodu binarnego poprzez rodzaj procesu refleksji”.

W standardowym kodowaniu najmniej znaczący bit ma powtarzający się wzór 2 włączony, 2 wyłączony (… 11001100 … ); następna cyfra wzór 4 włączony, 4 wyłączony; n ty bit najmniej znaczący wzór 2 n 2 n wyłączenia. Czterobitowa wersja tego jest pokazana poniżej:

Wizualizowane jako przechodzenie z wierzchołków o tesserakt
Dziesiętny Dwójkowy Szary Dziesiętna
szarość
0 0000 0000 0
1 0001 0001 1
2 0010 0011 3
3 0011 0010 2
4 0100 0110 6
5 0101 0111 7
6 0110 0101 5
7 0111 0100 4
8 1000 1100 12
9 1001 1101 13
10 1010 1111 15
11 1011 1110 14
12 1100 1010 10
13 1101 1011 11
14 1110 1001 9
15 1111 1000 8

Dla dziesiętnego 15 kod przechodzi do dziesiętnego 0 z tylko jedną zmianą przełącznika. Nazywa się to właściwością cykliczności lub sąsiedztwa kodu.

We współczesnej komunikacji cyfrowej kody Graya odgrywają ważną rolę w korekcji błędów . Na przykład, w schemacie modulacji cyfrowej , takim jak QAM, w którym dane są zwykle przesyłane w postaci symboli 4 bitowych lub więcej, diagram konstelacji sygnału jest ustawiony tak, że wzorce bitowe przenoszone przez sąsiednie punkty konstelacji różnią się tylko o jeden bit. Łącząc to z korekcją błędów w przód, zdolną do korygowania błędów jednobitowych, możliwe jest skorygowanie przez odbiornik wszelkich błędów transmisji, które powodują odchylenia punktu konstelacji w obszar sąsiedniego punktu. To sprawia, że ​​system transmisji jest mniej podatny na hałas .

Pomimo faktu, że Stibitz opisał ten kod przed Grayem, odbity kod binarny został później nazwany na cześć Graya przez innych, którzy go używali. Dwa różne zgłoszenia patentowe z 1953 r. używają „kodu Graya” jako alternatywnej nazwy „odbitego kodu binarnego”; jeden z nich wymienia także „minimalny kod błędu” i „cykliczny kod permutacji” wśród nazw. Zgłoszenie patentowe z 1954 r. odnosi się do „kodu Bell Telephone Grey”. Inne nazwy obejmują „cykliczny kod binarny”, „cykliczny kod progresji”, „cykliczny permutacyjny kod binarny” lub „cykliczny permutowany kod binarny” (CPB).

Kod Graya był czasami błędnie przypisywany Elisha Gray .

Historia i praktyczne zastosowanie

Zagadki matematyczne

Odbite kody binarne zostały zastosowane do zagadek matematycznych, zanim stały się znane inżynierom.

Odbity binarnie kod Graya reprezentuje podstawowy schemat klasycznej chińskiej układanki pierścieni , sekwencyjnego mechanicznego mechanizmu układanki opisanego przez francuskiego Louisa Grosa w 1872 roku.

Może służyć jako przewodnik po rozwiązaniu problemu Wieże Hanoi , opartego na grze Francuza Édouarda Lucasa z 1883 roku. Podobnie, tak zwane konfiguracje gier Wieże Bukaresztu i Wieże Klagenfurtu dają trój- i pięciokrotny kod Graya.

Martin Gardner napisał popularną relację o kodzie Graya w swoim artykule na temat gier matematycznych w Scientific American z sierpnia 1972 roku .

Kod tworzy również cykl Hamiltona na hipersześcianie , w którym każdy bit jest postrzegany jako jeden wymiar.

Kody telegraficzne

Kiedy francuski inżynier Émile Baudot zmienił kod 6-jednostkowy (6-bitowy) na 5-jednostkowy kod dla swojego systemu telegraficznego , w 1875 lub 1876 roku, uporządkował alfabetyczne znaki na swoim kole drukującym, używając odbitego kodu binarnego, i przypisał kody samogłoskom przy użyciu tylko trzech bitów. Z samogłoskami i spółgłoskami posortowanymi w kolejności alfabetycznej i innymi symbolami odpowiednio umieszczonymi, 5-bitowy kod znaku został rozpoznany jako odbity kod binarny. Kod ten stał się znany jako kod Baudota i, z niewielkimi zmianami, został ostatecznie przyjęty jako międzynarodowy alfabet telegraficzny nr 1 (ITA1, CCITT-1) w 1932 roku.

Mniej więcej w tym samym czasie niemiecko-austriacki Otto Schäffler  [ de ] zademonstrował w Wiedniu kolejny telegraf drukarski wykorzystujący w tym samym celu 5-bitowy kod binarny w tym samym celu.

Konwersja sygnału analogowo-cyfrowego

Frank Gray , który zasłynął z wynalezienia metody sygnalizacji, która zaczęła być używana w kompatybilnej telewizji kolorowej, wynalazł metodę konwersji sygnałów analogowych na odbite grupy kodów binarnych za pomocą aparatu opartego na lampie próżniowej . Zgłoszona w 1947 r. metoda i aparatura uzyskały patent w 1953 r., a nazwisko Gray przylgnęło do kodów. Aparatura „ PCM tube ” opatentowana przez Graya została wykonana przez Raymonda W. Searsa z Bell Labs, współpracującego z Grayem i Williamem M. Goodallem, którzy przypisali Grayowi pomysł odbitego kodu binarnego.

Część pierwszej strony patentu Graya, przedstawiająca rurkę PCM (10) z odbitym kodem binarnym na płycie (15)

Gray był najbardziej zainteresowany wykorzystaniem kodów w celu zminimalizowania błędów w konwersji sygnałów analogowych na cyfrowe; jego kody są nadal używane w tym celu.

Enkodery położenia

Enkoder obrotowy do przyrządów do pomiaru kąta oznaczonych 3-bitowym kodem Graya z odbiciem binarnym (BRGC)
Absolutny enkoder obrotowy z kodem Graya z 13 ścieżkami. Obudowa, przerywacz i źródło światła znajdują się na górze; element czujnikowy i elementy podporowe znajdują się na dole.

Kody Graya są używane w liniowych i obrotowych koderach położenia ( enkodery absolutne i kodery kwadraturowe ) zamiast ważonego kodowania binarnego. Pozwala to uniknąć możliwości, że gdy wiele bitów zmieni się w binarnej reprezentacji pozycji, błędna interpretacja będzie wynikiem zmiany niektórych bitów przed innymi.

Na przykład, niektóre enkodery obrotowe zapewniają dysk, który ma przewodzący elektrycznie wzór kodu Graya na koncentrycznych pierścieniach (ścieżkach). Każda ścieżka ma nieruchomy metalowy styk sprężynowy, który zapewnia kontakt elektryczny z przewodzącym wzorem kodu. Styki te razem wytwarzają sygnały wyjściowe w postaci kodu Graya. Inne kodery wykorzystują bezkontaktowe mechanizmy oparte na czujnikach optycznych lub magnetycznych do wytwarzania sygnałów wyjściowych kodu Graya.

Niezależnie od mechanizmu lub precyzji ruchomego enkodera błąd pomiaru położenia może wystąpić w określonych pozycjach (na granicach kodu), ponieważ kod może się zmieniać dokładnie w momencie jego odczytu (próbkowania). Wyjściowy kod binarny może powodować znaczne błędy pomiaru pozycji, ponieważ niemożliwe jest dokonanie zmiany wszystkich bitów dokładnie w tym samym czasie. Jeżeli w chwili próbkowania pozycji niektóre bity się zmieniły, a inne nie, to próbkowana pozycja będzie nieprawidłowa. W przypadku enkoderów absolutnych wskazana pozycja może być daleko od pozycji rzeczywistej, a w przypadku enkoderów przyrostowych może to zakłócić śledzenie pozycji.

W przeciwieństwie do tego, kod Graya używany przez enkodery położenia zapewnia, że ​​kody dla dowolnych dwóch kolejnych pozycji będą się różnić tylko o jeden bit, a w konsekwencji tylko jeden bit może się zmienić na raz. W takim przypadku maksymalny błąd pozycji będzie mały, wskazując pozycję sąsiadującą z rzeczywistą pozycją.

Algorytmy genetyczne

Ze względu na właściwości odległości Hamminga kodów Graya, są one czasami wykorzystywane w algorytmach genetycznych . Są bardzo przydatne w tej dziedzinie, ponieważ mutacje w kodzie pozwalają głównie na zmiany przyrostowe, ale czasami pojedyncza zmiana bitu może spowodować duży skok i doprowadzić do nowych właściwości.

Minimalizacja obwodu logicznego

Kody Graya są również używane w etykietowaniu osi map Karnaugha od 1953 roku, a także w wykresach kołowych Händlera od 1958 roku, obie graficzne metody minimalizacji obwodów logicznych .

Korekcja błędów

We współczesnej komunikacji cyfrowej kody Graya odgrywają ważną rolę w korekcji błędów . Na przykład, w schemacie modulacji cyfrowej , takim jak QAM, gdzie dane są zazwyczaj przesyłane w postaci symboli 4 bitowych lub więcej, diagram konstelacji sygnału jest ustawiony tak, że wzorce bitowe przenoszone przez sąsiednie punkty konstelacji różnią się tylko o jeden bit. Łącząc to z korekcją błędów w przód, zdolną do korygowania błędów jednobitowych, możliwe jest skorygowanie przez odbiornik wszelkich błędów transmisji, które powodują odchylenia punktu konstelacji w obszar sąsiedniego punktu. To sprawia, że ​​system transmisji jest mniej podatny na hałas .

Komunikacja między domenami zegarowymi

Projektanci logiki cyfrowej intensywnie wykorzystują kody Graya do przekazywania wielobitowych informacji o liczbie między logiką synchroniczną, która działa z różnymi częstotliwościami zegara. Uważa się, że logika działa w różnych „domenach zegarowych”. Jest to podstawa projektowania dużych chipów, które działają z wieloma różnymi częstotliwościami taktowania.

Rowerem przez stany przy minimalnym wysiłku

Jeśli system musi przechodzić przez wszystkie możliwe kombinacje stanów włącz-wyłącz pewnego zestawu elementów sterujących, a zmiany elementów sterujących wymagają nietrywialnych wydatków (np. czasu, zużycia, pracy ludzkiej), kod Graya minimalizuje liczbę ustawień zmienia się tylko na jedną zmianę dla każdej kombinacji stanów. Przykładem może być testowanie systemu rurociągów pod kątem wszystkich kombinacji ustawień jego ręcznie obsługiwanych zaworów.

Zrównoważony Szary kod może być skonstruowany, że odwraca każdy kawałek równie często. Ponieważ przerzutki bitowe są równomiernie rozłożone, jest to optymalne w następujący sposób: zrównoważone kody Graya minimalizują maksymalną liczbę przerzutów bitowych dla każdej cyfry.

Liczniki szarego kodu i arytmetyka

George R. Stibitz wykorzystywał odbity kod binarny w binarnym urządzeniu liczącym impulsy już w 1941 roku.

Typowym zastosowaniem liczników kodu Graya jest budowanie bufora danych FIFO (pierwsze weszło , pierwsze wyszło), który ma porty odczytu i zapisu, które istnieją w różnych domenach zegarowych. Liczniki wejścia i wyjścia wewnątrz takiego dwuportowego FIFO są często przechowywane przy użyciu kodu Graya, aby zapobiec przechwytywaniu nieprawidłowych stanów przejściowych, gdy licznik przekracza domeny zegara. Zaktualizowane wskaźniki odczytu i zapisu muszą być przekazywane między domenami zegara, gdy się zmieniają, aby móc śledzić pusty i pełny stan FIFO w każdej domenie. Każdy bit wskaźników jest próbkowany w sposób niedeterministyczny dla tego transferu domeny zegara. Tak więc dla każdego bitu propagowana jest stara lub nowa wartość. Dlatego też, jeśli więcej niż jeden bit we wskaźniku wielobitowym zmienia się w punkcie próbkowania, „niewłaściwa” wartość binarna (ani nowa, ani stara) może być propagowana. Gwarantując, że tylko jeden bit może się zmienić, kody Graya gwarantują, że jedynymi możliwymi wartościami próbkowanymi są nowa lub stara wartość wielobitowa. Zazwyczaj używane są kody Graya o długości potęgi dwóch.

Czasami magistrale cyfrowe w układach elektronicznych są używane do przesyłania ilości, które mogą się zwiększać lub zmniejszać tylko o jeden na raz, na przykład wyjście licznika zdarzeń, który jest przesyłany między domenami zegarowymi lub do przetwornika cyfrowo-analogowego. Zaletą kodów Graya w tych aplikacjach jest to, że różnice w opóźnieniach propagacji wielu przewodów reprezentujących bity kodu nie mogą powodować, że odebrana wartość przechodzi przez stany, które są poza sekwencją kodu Graya. Jest to podobne do przewagi kodów Graya w konstrukcji enkoderów mechanicznych, jednak źródłem kodu Graya jest w tym przypadku licznik elektroniczny. Sam licznik musi liczyć w kodzie Graya, lub jeśli licznik działa w trybie binarnym, to wartość wyjściowa z licznika musi zostać przetaktowana po przekonwertowaniu na kod Graya, ponieważ gdy wartość jest konwertowana z kodu binarnego na kod Graya, jest to możliwe że różnice w czasach przybycia bitów danych binarnych do obwodu konwersji binarnego do szarego będą oznaczać, że kod może przejść krótko przez stany, które są szalenie poza kolejnością. Dodanie taktowanego rejestru po obwodzie, który konwertuje wartość zliczoną na kod Graya, może wprowadzić cykl zegarowy opóźnienia, więc zliczanie bezpośrednio w kodzie Graya może być korzystne.

Aby wytworzyć następną wartość zliczeń w liczniku z kodem Graya, konieczne jest zastosowanie pewnej logiki kombinacyjnej, która zwiększy bieżącą wartość zliczeń, która jest przechowywana. Jednym ze sposobów zwiększenia liczby kodu Graya jest przekształcenie go w zwykły kod binarny, dodanie do niego jednego za pomocą standardowego sumatora binarnego, a następnie przekonwertowanie wyniku z powrotem na kod Graya. Inne metody liczenia w kodzie Graya zostały omówione w raporcie Roberta W. Dorana , w tym pobieranie danych wyjściowych z pierwszych zatrzasków przerzutników master-slave w binarnym liczniku tętnień.

Adresowanie szarym kodem

Ponieważ wykonanie kodu programu zazwyczaj powoduje wzorzec dostępu do pamięci instrukcji lokalnie następujących po sobie adresów, kodowanie magistrali wykorzystujące adresowanie w kodzie Graya zamiast adresowania binarnego może znacznie zmniejszyć liczbę zmian stanu bitów adresu, zmniejszając w ten sposób zużycie energii przez procesor w niektórych - projekty mocy.

Konstruowanie n- bitowego kodu Graya

Kilka pierwszych kroków metody odbicia i przedrostka.
Permutacja 4-bitowego kodu Graya

Lista kodów Graya z odzwierciedleniem binarnym dla n bitów może być generowana rekursywnie z listy dla n  - 1 bitów, odzwierciedlając listę (tj. wymieniając wpisy w odwrotnej kolejności), poprzedzając wpisy na oryginalnej liście binarnym 0 , poprzedzając wpisy na liście odzwierciedlonej z binarnym  1 , a następnie łączenie oryginalnej listy z listą odwróconą. Na przykład generowanie listy n  = 3 z listy n  = 2:

Lista 2-bitowa: 00 , 01 , 11 , 10  
Odbite:   10 , 11 , 01 , 00
Poprzedź stare wpisy liczbą 0 : 000 , 001 , 011 , 010 ,  
Poprzedź nowe wpisy liczbą 1 :   110 , 111 , 101 , 100
Połączone: 000 , 001 , 011 , 010 , 110 , 111 , 101 , 100

Jednobitowy kod Graya to G 1  = ( 0,1 ). Można to uznać za zbudowane rekursywnie jak powyżej z zerowego kodu Graya G 0  = (  Λ  ) składającego się z pojedynczego wpisu o zerowej długości. Ten iteracyjny proces generowania G n +1 z G n wyjaśnia następujące właściwości standardowego kodu odzwierciedlającego:

  • G n jest permutacją liczb 0, …, 2 n  − 1. (Każda liczba pojawia się na liście dokładnie raz).
  • G n jest osadzony jako pierwsza połowa G n +1 .
  • Dlatego kodowanie jest stabilne , w tym sensie, że gdy liczba binarna pojawi się w G n , pojawia się na tej samej pozycji we wszystkich dłuższych listach; więc sensowne jest mówienie o wartości odblaskowego kodu Graya liczby: G ( m ) = m- ty odzwierciedlający kod Graya, licząc od 0.
  • Każdy wpis w G n różni się tylko o jeden bit od poprzedniego wpisu. (Odległość Hamminga wynosi 1.)
  • Ostatni wpis w G n różni się tylko o jeden bit od pierwszego wpisu. (Kod jest cykliczny.)

Te cechy sugerują prostą i szybką metodę przetłumaczenia wartości binarnej na odpowiedni kod Graya. Każdy bit jest odwracany, jeśli następny wyższy bit wartości wejściowej jest ustawiony na jeden. Można to wykonać równolegle przez przesunięcie bitów i operację wyłączności lub, jeśli są one dostępne: n- ty kod Graya uzyskuje się przez obliczenie . Poprzedzenie 0 bitem pozostawia niezmienioną kolejność słów kodowych, poprzedzenie 1 bitem odwraca kolejność słów kodowych. Jeżeli bity na pozycji słów kodowych są odwrócone, kolejność sąsiednich bloków słów kodowych jest odwracana. Na przykład, jeśli bit 0 jest odwrócony w 3-bitowej sekwencji słowa kodowego, kolejność dwóch sąsiednich słów kodowych jest odwrócona

000,001,010,011,100,101,110,111 → 001 000,011,010,101,100,111,110  (odwróć bit 0)

Jeśli bit 1 jest odwrócony, bloki 2 słów kodowych zmieniają kolejność:

000,001,010,011,100,101,110,111 → 010,011,000,001,110,111,100,101  (odwróć bit 1)

Jeśli bit 2 jest odwrócony, bloki 4 słów kodowych odwracają kolejność:

000,001,010,011,100,101,110,111 → 100,101,110,111,000,001,010,011  (odwróć bit 2)

Tak więc, wykonanie wyłączności lub na bicie na pozycji z bitem na pozycji pozostawia nienaruszoną kolejność słów kodowych if i odwraca kolejność bloków słów kodowych if . Teraz jest to dokładnie ta sama operacja, co metoda odbicia i przedrostka w celu wygenerowania kodu Graya.

Podobną metodę można zastosować do wykonania translacji zwrotnej, ale obliczenie każdego bitu zależy od obliczonej wartości następnego wyższego bitu, więc nie można tego wykonać równolegle. Zakładając, że jest to bit zakodowany Grayem ( jest to najbardziej znaczący) i jest to bit zakodowany binarnie ( będący bitem najbardziej znaczącym), odwrotne tłumaczenie może być podane rekursywnie: , i . Alternatywnie, dekodowanie kodu Graya na liczbę binarną można opisać jako przedrostkową sumę bitów w kodzie Graya, gdzie każda indywidualna operacja sumowania w sumie przedrostkowej jest wykonywana modulo dwa.

Aby iteracyjnie skonstruować kod Graya z odbiciem binarnym, w kroku 0 zacznij od , a w kroku znajdź pozycję bitową najmniej znaczącej 1 w binarnej reprezentacji i odwróć bit na tej pozycji w poprzednim kodzie, aby uzyskać następny kod . Pozycje bitów zaczynają się 0, 1, 0, 2, 0, 1, 0, 3, …. Zobacz Znajdź pierwszy zestaw dla wydajnych algorytmów do obliczania tych wartości.

Konwersja do iz kodu Gray

Poniższe funkcje w języku C konwertują liczby binarne i związane z nimi kody Graya. Chociaż może się wydawać, że konwersja szarego na binarny wymaga obsługi każdego bitu pojedynczo, istnieją szybsze algorytmy.

typedef unsigned int uint;

// This function converts an unsigned binary number to reflected binary Gray code.
uint BinaryToGray(uint num)
{
    return num ^ (num >> 1); // The operator >> is shift right. The operator ^ is exclusive or.
}

// This function converts a reflected binary Gray code number to a binary number.
uint GrayToBinary(uint num)
{
    uint mask = num;
    while (mask) {           // Each Gray code bit is exclusive-ored with all more significant bits.
        mask >>= 1;
        num   ^= mask;
    }
    return num;
}

// A more efficient version for Gray codes 32 bits or fewer through the use of SWAR (SIMD within a register) techniques. 
// It implements a parallel prefix XOR function. The assignment statements can be in any order.
// 
// This function can be adapted for longer Gray codes by adding steps.

uint GrayToBinary32(uint num)
{
    num ^= num >> 16;
    num ^= num >>  8;
    num ^= num >>  4;
    num ^= num >>  2;
    num ^= num >>  1;
    return num;
}
// A Four-bit-at-once variant changes a binary number (abcd)2 to (abcd)2 ^ (00ab)2, then to (abcd)2 ^ (00ab)2 ^ (0abc)2 ^ (000a)2.

Specjalne rodzaje kodów Gray

W praktyce „kod Graya” prawie zawsze odnosi się do kodu Graya (BRGC). Jednak matematycy odkryli inne rodzaje kodów Graya. Podobnie jak BRGC, każdy składa się z listy słów, gdzie każde słowo różni się od następnego tylko jedną cyfrą (każde słowo ma odległość Hamminga 1 od następnego słowa).

n- ary Kod szarości

Numer trójkowy → trójkowy kod Gray

0 → 000
1 → 001
2 → 002
10 → 012
11 → 011
12 → 010
20 → 020
21 → 021
22 → 022
100 → 122
101 → 121
102 → 120
110 → 110
111 → 111
112 → 112
120 → 102
121 → 101
122 → 100
200 → 200
201 → 201
202 → 202
210 → 212
211 → 211
212 → 210
220 → 220
221 → 221
222 → 222

Istnieje wiele wyspecjalizowanych typów kodów Graya innych niż kod Graya z odzwierciedleniem binarnym. Jednym z takich typów kodu Graya jest n- arny kod Graya , znany również jako nie-boolowski kod Graya . Jak sama nazwa wskazuje, ten typ kodu Graya wykorzystuje w swoich kodowaniach wartości inne niż logiczne .

Na przykład 3-arny ( trójargumentowy ) kod Graya używałby wartości 0,1,2. Kod ( nk ) - Gray to n -arny kod Graya z k cyframi. Kolejność elementów w kodzie (3, 2)-Gray to: 00,01,02,12,11,10,20,21,22. Kod ( nk )-Gray'a może być konstruowany rekurencyjnie, jak BRGC, lub może być konstruowany iteracyjnie . Algorytm iteracyjnie generowania ( Nk ) kodu -gray jest przedstawiony (w C )

// inputs: base, digits, value
// output: Gray
// Convert a value to a Gray code with the given base and digits.
// Iterating through a sequence of values would result in a sequence
// of Gray codes in which only one digit changes at a time.
void toGray(unsigned base, unsigned digits, unsigned value, unsigned gray[digits])
{ 
	unsigned baseN[digits];	// Stores the ordinary base-N number, one digit per entry
	unsigned i;		// The loop variable
 
	// Put the normal baseN number into the baseN array. For base 10, 109 
	// would be stored as [9,0,1]
	for (i = 0; i < digits; i++) {
		baseN[i] = value % base;
		value    = value / base;
	}
 
	// Convert the normal baseN number into the Gray code equivalent. Note that
	// the loop starts at the most significant digit and goes down.
	unsigned shift = 0;
	while (i--) {
		// The Gray digit gets shifted down by the sum of the higher
		// digits.
		gray[i] = (baseN[i] + shift) % base;
		shift = shift + base - gray[i];	// Subtract from base so shift is positive
	}
}
// EXAMPLES
// input: value = 1899, base = 10, digits = 4
// output: baseN[] = [9,9,8,1], gray[] = [0,1,7,1]
// input: value = 1900, base = 10, digits = 4
// output: baseN[] = [0,0,9,1], gray[] = [0,1,8,1]

Istnieją inne algorytmy kodu Graya dla kodów ( n , k )-Gray'a. Kod ( n , k )-Gray'a wytworzony przez powyższy algorytm jest zawsze cykliczny; niektóre algorytmy, takie jak Guan, nie mają tej właściwości, gdy k jest nieparzyste. Z drugiej strony, podczas gdy tylko jedna cyfra na raz zmienia się za pomocą tej metody, można ją zmienić przez zawijanie (pętla od n  − 1 do 0). W algorytmie Guana liczba naprzemiennie rośnie i maleje, tak że różnica numeryczna między dwiema cyframi kodu Graya jest zawsze jedna.

Kody Graya nie są jednoznacznie zdefiniowane, ponieważ permutacja kolumn takiego kodu jest również kodem Graya. Powyższa procedura daje kod, w którym im mniejsza ważność cyfry, tym częściej się ona zmienia, upodabniając ją do normalnych metod liczenia.

Zobacz także Skew binarny system liczbowy , wariant trójskładnikowego systemu liczbowego, w którym co najwyżej dwie cyfry zmieniają się z każdym przyrostem, ponieważ każdy przyrost może być wykonany z co najwyżej jedną cyfrową operacją przenoszenia .

Zrównoważony kod szarości

Chociaż kod binarny odzwierciedlający Graya jest przydatny w wielu scenariuszach, w niektórych przypadkach nie jest optymalny z powodu braku „jednorodności”. W zrównoważonych kodach Graya liczba zmian w różnych pozycjach współrzędnych jest jak najbardziej zbliżona. Aby uczynić to bardziej precyzyjnym, niech G będzie R- arnym kompletnym cyklem Graya posiadającym sekwencję przejścia ; że liczy przejściowe ( spectrum ) o G stanowią zbiór liczb określonych

Kod Graya jest jednolity lub jednolicie zrównoważony, jeśli wszystkie jego liczby przejść są równe, w takim przypadku mamy dla wszystkich k . Oczywiście, gdy , takie kody istnieją tylko wtedy, gdy n jest potęgą 2. W przeciwnym razie, jeśli n nie dzieli się równo, możliwe jest skonstruowanie dobrze zrównoważonych kodów, w których każda liczba przejść wynosi albo lub . Kody Graya mogą być również zrównoważone wykładniczo, jeśli wszystkie ich liczby przejść są sąsiednimi potęgami dwójki, a takie kody istnieją dla każdej potęgi dwójki.

Na przykład zrównoważony 4-bitowy kod Graya ma 16 przejść, które można równomiernie rozłożyć na wszystkie cztery pozycje (cztery przejścia na pozycję), dzięki czemu jest równomiernie zrównoważony:

0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0
0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0
0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1

podczas gdy zrównoważony 5-bitowy kod Graya ma łącznie 32 przejścia, których nie można równomiernie rozłożyć między pozycjami. W tym przykładzie cztery pozycje mają po sześć przejść, a jedna ma osiem:

1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 0
1 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1
1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 1
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1

Pokażemy teraz konstrukcję i implementację dobrze zbalansowanych binarnych kodów Graya, która pozwala nam generować n- cyfrowy zrównoważony kod Graya dla każdego n . Główną zasadą jest indukcyjne skonstruowanie ( n  + 2)-cyfrowego kodu Graya przy n- cyfrowym kodzie Graya G w taki sposób, aby zachowana była zrównoważona właściwość. Aby to zrobić, rozważamy podziały na parzystą liczbę L niepustych bloków postaci

gdzie , , i ). Ta partycja indukuje -cyfrowy kod Graya podany przez

Jeśli zdefiniujemy krotności przejścia

być liczbą zmian cyfry na pozycji i między kolejnymi blokami w partycji, to dla ( n  + 2)-cyfrowego kodu Graya indukowanego przez ten podział widmo przejścia wynosi

Delikatną częścią tej konstrukcji jest znalezienie odpowiedniego podziału zrównoważonego n- cyfrowego kodu Graya, tak aby kod przez niego indukowany pozostał zrównoważony, ale w tym przypadku liczą się tylko krotności przejściowe; łączenie dwóch kolejnych bloków na przejściu cyfry i dzielenie innego bloku na przejściu cyfry daje inny kod Graya z dokładnie takim samym widmem przejścia , więc można na przykład oznaczyć pierwsze przejścia przy cyfrze jako te, które mieszczą się między dwoma blokami. Jednolite kody można znaleźć, gdy i , a tę konstrukcję można rozszerzyć również na przypadek R- ary.

Długookresowe kody szarości

Długookresowe kody Graya maksymalizują odległość między kolejnymi zmianami cyfr w tej samej pozycji. Oznacza to, że minimalna długość przebiegu dowolnego bitu pozostaje niezmieniona tak długo, jak to możliwe.

Monotoniczne kody szarości

Kody monotoniczne są przydatne w teorii sieci wzajemnych, szczególnie w celu minimalizacji dylatacji dla liniowych układów procesorów. Jeśli zdefiniujemy wagę ciągu binarnego jako liczbę jedynek w ciągu, to chociaż wyraźnie nie możemy mieć kodu Graya o ściśle rosnącej wadze, możemy to przybliżyć, przepuszczając kod przez dwie sąsiednie wagi przed osiągnięciem Następny.

Możemy sformalizować pojęcie monotonicznych kodów Graya w następujący sposób: rozważ podział hipersześcianu na poziomy wierzchołków, które mają jednakową wagę, tj.

dla . Te poziomy spełniają . Niech będzie podgrafem indukowanym przez i niech będzie krawędziami w . Monotoniczny kod Graya jest wtedy ścieżką Hamiltona w taki sposób, że kiedykolwiek pojawia się przed na ścieżce, wtedy .

Elegancka konstrukcja monotonicznych n- cyfrowych kodów Graya dla dowolnego n opiera się na idei rekursywnego budowania podścieżek o długości mającej krawędzie w . Definiujemy , kiedy lub , i

Inaczej. Tutaj jest odpowiednio zdefiniowaną permutacją i odnosi się do ścieżki P z jej współrzędnymi permutowanymi przez . Ścieżki te powodują powstanie dwóch monotonicznych n- cyfrowych kodów Graya i danych przez

Wybór, który zapewnia, że ​​te kody rzeczywiście są kodami Graya, okazuje się być . Kilka pierwszych wartości zostało pokazanych w poniższej tabeli.

Podścieżki w algorytmie Savage-Winkler
j = 0 j = 1 j = 2 j = 3
n = 1 0, 1
n = 2 00, 01 10, 11
n = 3 000, 001 100, 110, 010, 011 101, 111
n = 4 0000,
0001
1000, 1100, 0100,
0110, 0010, 0011
1010, 1011, 1001,
1101, 0101, 0111
1110,
1111

Te monotoniczne kody Graya można efektywnie zaimplementować w taki sposób, że każdy kolejny element może być generowany w czasie O ( n ). Algorytm najłatwiej opisać za pomocą współprogramów .

Kody monotoniczne mają interesujący związek z hipotezą Lovásza , która mówi, że każdy połączony graf przechodni wierzchołkowy zawiera ścieżkę Hamiltona. Podwykres „średniego poziomu” jest wierzchołkowo przechodni (to znaczy, że jego grupa automorfizmu jest przechodnia, tak że każdy wierzchołek ma to samo „lokalne środowisko”” i nie może być odróżniony od innych, ponieważ możemy zmienić oznaczenie współrzędnych, jak również cyfry binarne uzyskanie automorfizm ) i problem ze znalezieniem ścieżki Hamiltona w tym podgrafu nazywany jest „średnim poziomy problem”, który może zapewnić wgląd w bardziej ogólnym przypuszczeń. pytanie zostało odpowiedziało twierdząco na , a poprzedzający konstrukcja dla kodów monotonicznych zapewnia hamiltonian o długości co najmniej 0,839 N, gdzie N jest liczbą wierzchołków podgrafu środkowego.

Kod Becketta-Gray'a

Inny rodzaj kodu Graya, kod Becketta-Graya , pochodzi od irlandzkiego dramaturga Samuela Becketta , który interesował się symetrią . Jego sztuka „ Kwadrat ” składa się z czterech aktorów i podzielona jest na szesnaście okresów. Każdy okres kończy się wejściem lub wyjściem jednego z czterech aktorów. Spektakl zaczyna się od pustej sceny, a Beckett chciał, aby każdy podzbiór aktorów pojawił się na scenie dokładnie raz. Najwyraźniej zestaw aktorów obecnie na scenie może być reprezentowany przez 4-bitowy binarny kod Graya. Beckett nałożył jednak dodatkowe ograniczenie na scenariusz: chciał, aby aktorzy wchodzili i wychodzili, aby ten, który był na scenie najdłużej, zawsze wychodził. Aktorzy mogliby być wtedy reprezentowani przez kolejkę pierwszy wszedł , pierwszy wyszedł , tak aby (z aktorów na scenie) usuwany był zawsze ten, który został umieszczony w kolejce jako pierwszy. Beckett nie był w stanie znaleźć kodu Becketta-Graya dla swojej sztuki i rzeczywiście, wyczerpująca lista wszystkich możliwych sekwencji pokazuje, że taki kod nie istnieje dla n = 4. Dziś wiadomo, że takie kody istnieją dla n = 2,5 6, 7 i 8, a nie występować z n = 3 lub 4. przykład 8-bitowym kodem Beckett-szary można znaleźć w Donald Knuth jest Sztuka programowania . Według Sawady i Wonga przestrzeń poszukiwań dla n = 6 można zbadać w 15 godzin i znaleziono ponad 9500 rozwiązań dla przypadku n = 7.

Kody Snake-in-the-box

Maksymalne długości węży ( L s ) i zwojów ( L c ) w problemie węży w pudełku dla wymiarów n od 1 do 4

Kody wężowe w pudełku lub węże to sekwencje węzłów indukowanych ścieżek w n- wymiarowym wykresie hipersześcianowym , a kody cewki w pudełku lub cewki to sekwencje węzłów indukowanych cykli w hipersześcian. Postrzegane jako kody Graya, sekwencje te mają właściwość wykrywania każdego jednobitowego błędu kodowania. Kody tego typu zostały po raz pierwszy opisane przez Williama H. ​​Kautza pod koniec lat pięćdziesiątych; od tego czasu przeprowadzono wiele badań nad znalezieniem kodu z największą możliwą liczbą słów kodowych dla danego wymiaru hipersześcianu.

Jednotorowy szary kod

Jeszcze innym rodzajem kodu Graya jest jednościeżkowy kod Graya (STGC) opracowany przez Normana B. Speddinga i dopracowany przez Hiltgena, Patersona i Brandestiniego w „Single-track Gray code” (1996). STGC jest cykliczną listą P unikalnych kodowań binarnych o długości n tak, że dwa kolejne słowa różnią się dokładnie o jedną pozycję, a gdy lista jest sprawdzana jako macierz P  ×  n , każda kolumna jest cyklicznym przesunięciem pierwszej kolumny.

Jednotorowy kod Graya z 5 czujnikami.
Animowana i oznaczona kolorami wersja rotora STGC.

Nazwa pochodzi od ich użycia z enkoderami obrotowymi , w których liczba ścieżek jest wykrywana przez styki, co daje wynik 0 lub 1 dla każdego . Aby zredukować szumy wynikające z tego, że różne styki nie przełączają się dokładnie w tym samym momencie, najlepiej jest ustawić ścieżki tak, aby dane wyprowadzane przez styki były w kodzie Graya. Aby uzyskać wysoką dokładność kątową, potrzeba wielu kontaktów; aby osiągnąć dokładność co najmniej 1°, potrzeba co najmniej 360 różnych pozycji na obrót, co wymaga minimum 9 bitów danych, a więc tej samej liczby styków.

Jeśli wszystkie styki są umieszczone w tym samym położeniu kątowym, potrzeba 9 ścieżek, aby uzyskać standardowy BRGC z dokładnością co najmniej 1°. Jeśli jednak producent przesunie styk do innej pozycji kątowej (ale w tej samej odległości od wału środkowego), wówczas odpowiedni „wzór pierścienia” musi zostać obrócony o ten sam kąt, aby uzyskać tę samą moc wyjściową. Jeśli najbardziej znaczący bit (pierścień wewnętrzny na rysunku 1) zostanie wystarczająco obrócony, dokładnie pasuje do następnego pierścienia. Ponieważ oba pierścienie są wtedy identyczne, pierścień wewnętrzny można wyciąć, a czujnik tego pierścienia przesunąć na pozostały, identyczny pierścień (ale przesunięty pod tym kątem od drugiego czujnika na tym pierścieniu). Te dwa czujniki na jednym pierścieniu tworzą enkoder kwadraturowy. Zmniejsza to liczbę ścieżek dla enkodera kątowego o rozdzielczości 1° do 8 ścieżek. Dalszego zmniejszenia liczby utworów nie da się osiągnąć za pomocą BRGC.

Przez wiele lat Torsten Sillke i inni matematycy uważali, że niemożliwe jest zakodowanie pozycji na jednej ścieżce tak, że kolejne pozycje różnią się tylko jednym czujnikiem, z wyjątkiem 2-czujnikowego, 1-ścieżkowego kodera kwadraturowego. Tak więc w przypadku aplikacji, w których 8 ścieżek było zbyt obszernych, ludzie używali jednościeżkowych enkoderów przyrostowych (enkodery kwadraturowe) lub 2-ścieżkowych enkoderów „kwadraturowych + wycięcie referencyjne”.

Norman B. Spedding jednak zarejestrował patent w 1994 roku, na kilku przykładach pokazujących, że jest to możliwe. Chociaż nie jest to możliwe do odróżnienia 2 n stanowiska z n czujników na jednym torze, to jest możliwe do odróżnienia zbliżony do wielu. Etzion i Paterson przypuszczają, że gdy n samo jest potęgą 2, n czujników może rozróżnić co najwyżej 2 n  -2 n pozycji, a dla n liczby pierwszej granica wynosi 2 n  -2 pozycji. Autorzy wygenerowali 504-pozycyjny kod jednościeżkowy o długości 9, który ich zdaniem jest optymalny. Ponieważ liczba ta jest większa niż 2 8 = 256, każdy kod wymaga więcej niż 8 czujników, chociaż BRGC może rozróżnić 512 pozycji z 9 czujnikami.

Tutaj odtworzono STGC dla P  = 30 i n  = 5:

Jednotorowy szary kod dla 30 pozycji
Kąt Kod Kąt Kod Kąt Kod Kąt Kod Kąt Kod
dziesięć tysięcy 72° 01000 144° 00100 216° 00010 288° 00001
12° 10100 84° 01010 156° 00101 228° 10010 300° 01001
24° 11100 96° 01110 168° 00111 240° 10011 312° 11001
36° 11110 108° 01111 180° 10111 252° 11011 324° 11101
48° 11010 120° 01101 192° 10110 264° 01011 336° 10101
60° 11000 132° 01100 204° 00110 276° 00011 348° 10001

Każda kolumna jest cyklicznym przesunięciem pierwszej kolumny, a z dowolnego wiersza do następnego zmienia się tylko jeden bit. Jednośladowy charakter (jak łańcuch kodowy) jest przydatny w produkcji tych kół (w porównaniu z BRGC), ponieważ potrzebny jest tylko jeden tor, co zmniejsza ich koszt i rozmiar. Natura kodu Graya jest użyteczna (w porównaniu z kodami łańcuchowymi , zwanymi również sekwencjami De Bruijna ), ponieważ tylko jeden czujnik będzie się zmieniał w dowolnym momencie, więc niepewność podczas przejścia między dwoma stanami dyskretnymi będzie wynosić tylko plus lub minus jedną jednostkę kąta pomiar, jaki urządzenie jest w stanie rozdzielić.

Dwuwymiarowy kod szarości

Diagram konstelacji z kodowaniem Graya dla prostokątnej 16- QAM

W komunikacji używane są dwuwymiarowe kody Graya, aby zminimalizować liczbę błędów bitowych w sąsiednich punktach z kwadraturową modulacją amplitudy (QAM) w konstelacji . W typowym kodowaniu sąsiednie punkty konstelacji poziome i pionowe różnią się o jeden bit, a sąsiednie punkty ukośne różnią się o 2 bity.

Dwuwymiarowe kody Graya mają również zastosowanie w schematach identyfikacji lokalizacji , gdzie kod byłby stosowany do map obszaru, takich jak odwzorowanie powierzchni Ziemi Mercatora, a do obliczenia odpowiedniej dwuwymiarowej funkcji odległości, takiej jak metryka Mannheima, odległość między dwoma zakodowanymi lokalizacjami, łącząc w ten sposób cechy odległości Hamminga z cykliczną kontynuacją projekcji Mercator.

Izometria szarości

Odwzorowanie bijektywne { 0 ↔ 00 , 1 ↔ 01 , 2 ↔ 11 , 3 ↔ 10 } ustanawia izometrię pomiędzy przestrzenią metryczną nad skończonym polem z metryką podaną przez odległość Hamminga i przestrzenią metryczną nad skończonym pierścieniem (zwykły arytmetyka modularna ) z metryką podaną przez odległość Lee . Mapowanie jest odpowiednio rozszerzone do izometrii przestrzeni Hamminga i . Jej kłamstwa znaczenie utworzenia korespondencji pomiędzy różnymi „dobry”, ale niekoniecznie kodów liniowych jak obrazy w Grey-map z kodów pierścieniowych liniowy z .

Powiązane kody

Istnieje wiele kodów binarnych podobnych do kodów Graya, w tym:

  • Kody Datex, czyli kody Gianniniego (1954), opisane przez Carla P. Spauldinga, wykorzystują wariant kodu O'Briena II .
  • Kody stosowane przez firmę Varec (ok. 1954) wykorzystują wariant kodu O'Briena I oraz warianty kodu o podstawie 12 i 16 Graya.
  • Kod Lucala (1959) aka zmodyfikowany odbity kod binarny (MRB)
  • Kod Gillham (1961/1962), używa wariantu kodu Datex i kodu O'Brien II .
  • Kod Lesliego i Russella (1964)
  • Kod Królewskiej Instytucji Radarowej
  • Kodeks Hoklasa (1988)

Następujące kody dziesiętne kodowane binarnie (BCD) są również wariantami kodu Graya:

  • Kod Petherick (1953), znany również jako kod Royal Aircraft Establishment (RAE).
  • Kody O'Briena I i II (1955) (Kod O'Brien typu I został już opisany przez Frederica A. Fossa z IBM i używany przez firmę Varec w 1954 roku. Później był również znany jako kod Wattsa lub Watts odzwierciedlenie dziesiętne ( WRD) i jest czasami niejednoznacznie określany jako odzwierciedlony, zmodyfikowany binarnie kod Graya (kod O'Briena typu II był już używany przez Datex w 1954 r.)
  • Nadmiar 3 Grey (1956) (znany również jako Nadmiar Graya 3, Nadmiar Graya 3, Kod Nadmiar Graya 3, Kod Nadmiar Graya, Kod Nadmiar Graya, Kod Nadmiar Graya 10 lub Kod Gray-Stibitz), opisane przez Franka P. Turveya Jr. z ITT .
  • Kody Tompkinsa I i II (1956)
  • Kod Glixona (1957), czasami niejednoznacznie nazywany również zmodyfikowanym kodem Graya
4-bitowe kody BCD na jednostkę odległości
Nazwa Fragment 0 1 2 3 4 5 6 7 8 9 Wagi Utwory Kompl. Cykliczny 5s Komentarz
Szary BCD 4 0 0 0 0 0 0 0 0 1 1 0-3 4 (3) Nie (2, 4, 8, 16) Nie
3 0 0 0 0 1 1 1 1 1 1
2 0 0 1 1 1 1 0 0 0 0
1 0 1 1 0 0 1 1 0 0 1
Paweł 4 1 0 0 0 0 0 0 0 1 1 1-3 4 (3) Nie 2, 10 Nie
3 0 0 0 0 1 1 1 1 1 1
2 0 0 1 1 1 1 0 0 0 0
1 1 1 1 0 0 1 1 0 0 1
Glixon 4 0 0 0 0 0 0 0 0 1 1 0-3 4 Nie 2, 4, 8, 10 (przesunięty +1)
3 0 0 0 0 1 1 1 1 1 0
2 0 0 1 1 1 1 0 0 0 0
1 0 1 1 0 0 1 1 0 0 0
Tompkinsa 4 0 0 0 0 0 1 1 1 1 1 0-4 2 Nie 2, 4, 10 tak
3 0 0 0 0 1 1 1 1 1 0
2 0 0 1 1 1 1 1 0 0 0
1 0 1 1 0 0 0 1 1 0 0
O'Brien I (Waty) 4 0 0 0 0 0 1 1 1 1 1 0-3 4 9 2, 4, 10 tak
3 0 0 0 0 1 1 0 0 0 0
2 0 0 1 1 1 1 1 1 0 0
1 0 1 1 0 0 0 0 1 1 0
Piotra (RAE) 4 0 0 0 0 0 1 1 1 1 1 1-3 3 9 2, 10 tak
3 1 0 0 0 1 1 0 0 0 1
2 0 0 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 1 1 1
O'Brien II 4 0 0 0 0 0 1 1 1 1 1 1-3 3 9 2, 10 tak
3 0 0 0 1 1 1 1 0 0 0
2 0 1 1 1 0 0 1 1 1 0
1 1 1 0 0 0 0 0 0 1 1
Susskinda 4 0 0 0 0 0 1 1 1 1 1 1-4 3 9 2, 10 tak
3 0 0 1 1 1 1 1 1 0 0
2 0 1 1 1 0 0 1 1 1 0
1 1 1 1 0 0 0 0 1 1 1
Klara 4 0 0 0 0 0 1 1 1 1 1 0-4 4 (3) 9 2, 10 tak
3 0 0 0 1 1 1 1 0 0 0
2 0 0 1 1 1 1 1 1 0 0
1 0 1 1 1 0 0 1 1 1 0
Tompkins II 4 0 0 0 0 0 1 1 1 1 1 1-3 2 9 2, 10 tak
3 0 0 1 1 1 1 1 0 0 0
2 1 1 1 0 0 0 0 0 1 1
1 0 1 1 1 0 0 1 1 1 0
Nadmiar-3 szary 4 0 0 0 0 0 1 1 1 1 1 1-4 4 9 2, 10 tak
3 0 1 1 1 1 1 1 1 1 0
2 1 1 1 0 0 0 0 1 1 1
1 0 0 1 1 0 0 1 1 0 0

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Zewnętrzne linki