Strona głównaArtykułyAlgorytmy

Kod Graya: Jedna Zmiana Bitu na Raz

Odzwierciedlone binarne, dlaczego g = b XOR (b>>1) działa, jego ścieżka Hamiltona przez hiperkub, oraz kodery obrotowe, które z niego wynikają.

mysimulator teamZaktualizowano — czerwiec 2026≈ 7 min czytania▶ Otwórz symulację

Problem z prostymi binarnymi

Liczenie w zwykłym binarze wygląda na spokojnie na papierze, ale liczba bitów zmieniających się między kolejnymi wartościami jest bardzo nierówna. Przejście od 3 do 4 bitów powoduje zmianę w trzech bitach (011 → 100); przejście od 7 do 8 bitów powoduje zmianę w czterech bitach (0111 → 1000). Jeśli fizyczny czujnik – encoder obrotowy, bank przełączników mechanicznych – jest odczytywany dokładnie w momencie, gdy ma zmienić się kilka bitów, to bity rzadko zmieniają się idealnie synchronicznie. Czytnik może wychwycić niektóre bity już zmienione i inne jeszcze nie, co prowadzi do fałszywej wartości pośredniej, która nie jest ani blisko starej, ani nowej pozycji.

Odbity binarny: g = b XOR (b przesunięte w prawo o 1)

Frank Gray's 1953 patent (opierając się na wcześniejszej pracy Émile Baudota) rozwiązuje to poprzez przekształcenie tych samych 2ⁿ wartości, tak że każdy kolejny parzysty różni się dokładnie w jednym bicie. Dla zwykłego binaru b, jego kod Graya g jest:

g = b XOR (b przesunięte w prawo o 1) b (binarne) g (Gray) 000 000 001 001 010 011 011 010 100 110 101 111 110 101 111 100 Nazwa "odbity binarny" pochodzi od rekurencyjnego konstruowania: sekwencja Graya o n bitach to sekwencja (n-1) bitów zapisana do przodu z przyrostkiem 0, a następnie ta sama sekwencja (n-1) bitów zapisana wstecznie (odbicie) z przyrostkiem 1. Każde odbicie gwarantuje różnicę w połączeniu między dwoma połowami o dokładnie jeden bit — nowy przyrostkowy bit — podczas gdy wnętrze każdej połowy już spełnia właściwość zmiany jednego bita przez indukcję.

g = b XOR (b >> 1)

  b (binary)   g (Gray)
  000          000
  001          001
  010          011
  011          010
  100          110
  101          111
  110          101
  111          100

Rozkodowanie do binarnych bitów

XOR, który zbudował kod szarości, można łatwo cofnąć za pomocą skanowania kumulatywnego XOR od najbardziej znaczącego bitu w dół: górne wyjście odpowiada górnemu bitowi szarości i każdy kolejny bit jest XORem poprzedniego bita wyjściowego z bieżącym bitem szarości.

// decode: Gray -> binary, most-significant bit first
b[0] = g[0];
for (i = 1; i < n; i++) {
  b[i] = b[i - 1] XOR g[i];
}

Hamiltonowska ścieżka na hiperkule

Wyobraź sobie graf, którego wierzchołkami są 2ⁿ wierzchołków, które to wszystkie ciągi bitów o długości n, z krawędzią między dowolnymi dwiema różnymi ciągami, które różnią się tylko jednym bitem — jest to graf hiperkuli wymiarowej. Ponieważ kolejne kodowanie Graya różni się od siebie o jeden bit ze względu na konstrukcję, sekwencja kodowania Graya jest dokładnie hamiltonowską ścieżką przez ten graf: trasą, która odwiedza każdy wierzchołek dokładnie raz, przemieszczając się tylko po krawędziach. Standardowy kodowanie Graya jest faktycznie cyklem hamiltonowskiego, ponieważ ostatni ciąg i pierwszy różnią się od siebie o jeden bit (tylko górny bit, dzięki konstrukcji odbicia).

Ten widok graficzny wyjaśnia, dlaczego kodowanie Graya tak dobrze uogólnia się: każda hamiltonowska ścieżka na hiperkule daje ważny porządek "zmiany jednego bita", a kodowanie Graya jest po prostu najbardziej systematycznym i najłatwiejszym do obliczenia. Jest to również podstawa klasycznego algorytmu rekurencyjnego/iteracyjnego generowania wszystkich podzbiorów zbioru jeden element na raz — chodzenie sekwencją Graya przełącza dokładnie jedną przynależność do podzbioru w każdym kroku.

demo na żywo · powiązana symulacja● LIVE

Gdzie jest to faktycznie wykorzystywane

Kodery obrotowe i liniowe o pełnej skali drukowują wzorzec zakodowany w szarości na dysku lub taśmie, ponieważ zapewniają one gwarancję pojedynczego bitu: błąd w pobliżu granicy przejścia nie powoduje skoku o pozycję, a jedynie niedokorygowanie o jedną pozycję. Mapy Karnaugha w projektowaniu logicznym cyfrowym ułożą swoje wiersze i kolumny w kodzie szarości tak, aby sąsiednie komórki zawsze różniły się o jeden bit wejściowy, co czyni wizualne grupowanie sąsiadujących 1 na prostokąty ważnym sposobem identyfikacji minimalnych uproszczeń Boole'a. Kod szarości pojawia się również w algorytmach genetycznych (zmiana jednego bita powoduje niewielkie, przewidywalne zmiany w rozkodowanej wartości, w przeciwieństwie do binarnych, gdzie pojedyncza mutacja bitu może spowodować ogromny skok wartości), a także w schematach korekcji błędów, które minimalizują uszkodzenia numeryczne spowodowane przez błąd transmisji pojedynczego bitu.

Frequently asked questions

Dlaczego kod szarości jest używany w enkoderach obrotowych zamiast zwykłego kodu binarnie?

Dzieje się tak dlatego, że zmienia się tylko jeden bit między sąsiednimi pozycjami. W przypadku zwykłego kodu binarnego przejście z np. 0111 na 1000 powoduje zmianę czterech bitów naraz, a jeśli czujnik odczytuje je kilka nanosekund po sobie, może tymczasowo generować błędne wartości, takie jak 1111 lub 0000. Kod szarości sprawia, że każde sąsiednie odczyty różni się o dokładnie jeden bit, więc błąd podczas przejściu jest ograniczony do maksymalnie jednej pozycji.

Jak przekształcić kod szarości z powrotem na kod binarny?

Kolektywny XOR od najwybitowego w dół: najwyższy bit pozostaje niezmieniony, a każdy kolejny bit binarnego kodu jest XORem poprzedniego bitu binarnego z odpowiadającym mu bitem szarości. Odwzorowuje to działanie XOR-a z kopiowaniem przesuniętym w lewo, które wygenerowało kod szarości pierwotnie i zajmuje O(log n) kroków sekwencyjnych w wersji naiwnej lub O(log log n) przy użyciu sztuczki z prefiksem równoległym.

Czy kod szarości jest tym samym, co ścieżka Hamiltona?

Standardowa sekwencja kodu szarości o n bitach to konkretna ścieżka Hamiltona przez hiperkulę n-wymiarową, gdzie wierzchołki stanowią ciągi binarne 2^n a krawędzie łączą ciągi różniące się o jeden bit. Istnieje wiele innych ścieżek Hamiltona i nawet cykli Hamiltona na tym samym grafie – kod szarości jest po prostu najbardziej znanym, najsystematycznie konstruowalnym.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Gray Code i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Gray Code

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)