Szám | bináris kód | Szürke kód |
---|---|---|
0 | 0000 | 0000 |
egy | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0010 |
négy | 0100 | 0110 |
5 | 0101 | 0111 |
6 | 0110 | 0101 |
7 | 0111 | 0100 |
nyolc | 1000 | 1100 |
9 | 1001 | 1101 |
tíz | 1010 | 1111 |
tizenegy | 1011 | 1110 |
12 | 1100 | 1010 |
13 | 1101 | 1011 |
tizennégy | 1110 | 1001 |
tizenöt | 1111 | 1000 |
A Gray kód bináris kód , egyébként tükörkód, egyben tükröződő kód is, amelyben két „szomszédos” ( rendezett, azaz lexikográfiai halmazban ) kódkombináció csak egy számjegyben különbözik egy bináris számjegyben. . Más szavakkal, a szomszédos kódszavak közötti Hamming-távolság 1.
A gyakorlatban leggyakrabban használt reflexív bináris Gray -kód , bár általában végtelen számú Gray-kód létezik, amelyekben a számjegyek értékei különböző ábécékből vett számjegyekben vannak. A legtöbb esetben a "Grey code" kifejezés pontosan a reflexív bináris Gray kódot jelenti.
Eredetileg az elektromechanikus kapcsolók téves működése elleni védelmet szolgálta. Manapság a Gray kódokat széles körben használják a kommunikációs rendszerekben előforduló hibák észlelésének és kijavításának , valamint a vezérlőrendszerekben a visszacsatoló jelek kialakításának egyszerűsítésére.
A Gray kódot "reflexívnek" (reflexiónak) nevezik, mivel az értékek első fele átrendezéskor a legjelentősebb bit kivételével egyenértékű a második felével. A legjelentősebb bitet egyszerűen megfordítják. Minden új felét kettéosztva ez a tulajdonság megmarad (lásd az önhasonlóságot ).
A kódot Frank Gray kutatóról nevezték el, aki a Bell laborban dolgozott . Gray szabadalmaztatta (szabadalmi szám: 2632058), és először használta ezt a kódot impulzuskommunikációs rendszerében.
A szürke kódot változó digitális jelek továbbítására használják órajel hiányában (például sokféle érzékelőnél). Képzeljük el, hogy a kód (normál bináris) 3→4, vagy 011 2 → 100 2 ugrik . Ha az olvasó tökéletlensége miatt az első bitet 011-ből, a maradék két bitet pedig 100-ból olvassuk ki, akkor 000 2 = 0 -t kapunk - ez a szám távol áll a valós értékektől. A Gray-kódban nem lesznek idegen értékek: az ugrás egy bitben történik, 010 G → 110 G , és vagy a régi 010 G =3-at, vagy az új 110 G =4-et vesszük figyelembe.
Ha az olvasó annyira lassú, hogy a leolvasások többször változtak a leolvasás során, a Gray kód garantálja, hogy a hiba kicsi lesz - kisebb, mint a tényleges jelváltozás. Például, ha a leolvasási idő alatt a leolvasások 010 G =3 → 110 G → 111 G =5 értékre változtak, akkor ezen a három érték mellett 011 G =2 - t kaphat - egy hiba jön ki.
Ha az érzékelő kör alakú (például egy forgó jeladó ), akkor maximumról nullára kell ugrania. Egy ilyen ugrás ( 100 G =7 -ről 000 G =0 -ra ) szintén egy bitet változtat.
A kódoló érzékelőkben gyakran használnak szürke kódokat . Használatuk kényelmes, mert a jelskála két szomszédos értéke csak egy bitben különbözik. A merevlemezeken található számok kódolására is használják őket .
A Gray kód a Hanoi Towers probléma megoldására is használható .
A szürke kódokat az egész számokkal reprezentált genetikai tulajdonságok kódolására szolgáló genetikai algoritmusok elméletében is széles körben használják.
A szürke kódot a forgóajtó módszerrel való kombinációk generálására használják [1] .
Egyes számítógépes játékokban (például Duke Nukem 3D ) a szint sikeres teljesítéséhez ki kell választania több kapcsoló pozíciójának megfelelő kombinációját. Nincsenek tippek, csak át kell menni az összes kombináción. Az opciók ismétlése során a váltások számának minimalizálása érdekében a Gray kódot kell használni. Például, ha három kapcsoló van, akkor ezeket 000, 001, 011, 010, 110 sorrendben próbáljuk ki.
A kifinomult érzékelők, amelyek órajelet igényelnek, eltérnek a Gray-kódtól, és hagyományos binárisan működnek [2] .
Szürke kódok könnyen előállíthatók bináris számokból egy bitenkénti XOR művelettel , ahol ugyanazt a számot egy bittel jobbra toljuk, és amelyben a legjelentősebb bitet nullával töltjük ki. Ezért a G i Gray-kód i -edik bitje a B i bináris kód bitjeiben a következőképpen van kifejezve :
hol van az XOR művelet; A bitek számozása jobbról balra történik, a legkisebb jelentőségű bittől kezdve.
A következő egy algoritmus a binárisról Gray kódra konvertálására, C nyelven írva :
unsigned int grayencode ( unsigned int g ) { return g ^ ( g >> 1 ); }Emlékeztetni kell azonban arra, hogy ez az algoritmus akkor fog megfelelően működni, ha a fordító nem ciklikus logikai eltolást valósít meg (például a C nyelvi szabvány nem határozza meg az eltolás típusát az előjeles számoknál, de a támogatás az előjel nélküli típusoknál garantált).
Ugyanez az algoritmus Pascalban írva:
függvény BinToGray ( b : egész szám ) : egész szám ; begin BinToGray := b xor ( b shr 1 ) end ;Példa: Alakítsa át az 10110-es bináris számot szürke kódra.
10110 01011 ----- XOR 11101A fordított algoritmus - a Gray-kódot bináris kóddá alakítva - a rekurzív képlettel fejezhető ki
továbbá az átalakítás bitenként történik, a legmagasabb számjegyektől kezdve, és a képletben használt értéket az algoritmus előző lépésében számítjuk ki. Valóban, ha a fenti kifejezést behelyettesítjük a Gray-kód i - edik bitjébe ebbe a képletbe, akkor azt kapjuk,
A fenti, az egyes bitek manipulálásával kapcsolatos algoritmus azonban kényelmetlen szoftveres megvalósításhoz, ezért a gyakorlatban egy módosított algoritmust használnak:
ahol N a Gray-kód bitjeinek száma (az algoritmus sebességének növelése érdekében N -t a Gray-kód legjelentősebb nem nulla bitjének számának vehetjük); az előjel a "kizárólagos VAGY" művelettel történő összegzést jelent, azaz
Valójában, ha a Gray-kód i -edik bitjének kifejezését behelyettesítjük a képletbe, azt kapjuk
Itt azt feltételezzük, hogy a bitrácson ( ) túllépő bit nullával egyenlő.
Az alábbiakban látható egy C függvény, amely megvalósítja ezt az algoritmust. Végrehajt egy szekvenciális eltolást jobbra és az eredeti bináris szám összegzését, amíg a következő eltolás vissza nem állítja az összegzést.
unsigned int gray decode ( unsigned int gray ) { unsigned int bin ; for ( bin = 0 ; szürke ; szürke >>= 1 ) { bin ^= szürke ; } visszatérő tartály ; }Ugyanez az algoritmus Pascalban írva:
függvény GrayToBin ( b : integer ) : integer ; var g : integer ; kezdődik g := 0 ; míg b > 0 kezd g : = g xor b ; b := b shr 1 ; vége ; GrayToBin := g ; vége ;Példa: A Gray kód 11101 konvertálása binárissá.
11101 01110 00111 00011 00001 ----- 10110A 8/16/24/32 bites Gray-kód értékének gyors átalakítása C bináris kóddá (Megjegyzés: Az eredeti Gray-kód összetett. Ahol minden bittetrad külön szám, és külön kódolják. Ez a kód nem teljes Gray-kód És az új számra való áttérés során egy bit szabályváltozásai csak minden 4-en belül tárolódnak. Például, amikor 0x0F-ről 0x10-re lépünk, két bit egyszerre változik, mivel két tetradban van változás 0-> 1 és F-> 0):
int gray2bin ( int x ) { vissza x ^ (( x & 0x88888888 ) >> 3 ) ^ (( x & 0xCCCCCCCC ) >> 2 ) ^ (( x & 0xEEEEEEEE ) >> 1 ); }A bináris számok Gray-kóddá alakításának egyszerű módja a szabály szerint történik: a legjelentősebb bitet változatlanul írjuk be, minden következő Gray-kód szimbólumot meg kell fordítani, ha a természetes kód korábban "1"-et kapott, és változatlanul hagyja. ha a természetes kódban "1" érkezett. 0".
Az n bites Grey-kód rekurzív módon összeállítható az n-1 bites kódból a bitek listájának átfordításával (vagyis a kódok fordított sorrendben történő felírásával), az eredeti és a fordított listák összefűzésével, nullákat fűzve mindegyik elejéhez. kódot az eredeti listában, és az egyeseket a kódok elejére a fordított listában. Tehát egy lista létrehozásához n = 3 bitre a két bit kódjai alapján, a következő lépéseket kell végrehajtani:
n = 2 bites kódok: | 00, 01, 11, 10 | |
Fordított kódlista: | 10, 11, 01, 00 | |
Kombinált lista: | 00, 01, 11, 10 | 10, 11, 01, 00 |
Nullák hozzáadva a kezdeti listához: | 000, 001, 011, 010 | 10, 11, 01, 00 |
A fordított listához hozzáadott egységek: | 000, 001, 011, 010 | 110, 111, 101, 100 |
Az alábbiakban az egyik algoritmus található egy adott mélységű Gray-kód sorozat generálására, Perl nyelven írva :
az én $mélységem = 16 ; # generál 16 szürke kódot, mindegyik 4 bit széles my @gray_codes = ( '0' , '1' ); while ( skalár ( @szürke_kódok ) < $mélység ) { my @forward_half = térkép { '0' . $_ } @gray_codes ; my @reverse_half = map { '1' . $_ } fordított ( @gray_codes ); @gray_codes = ( @előre_fél , @fordított_fél ); }Rekurzív függvény Gray kód létrehozásához C nyelven :
//n -- szükséges kódhossz, //m -- mutató egy tömbre, amely képes tárolni // az összes Gray kódot, legfeljebb n hosszú // (a függvény meghívása előtt le kell foglalni) //mélység -- rekurziós paraméter int szürke ( int n , int * m , int mélység ) { int i , t = ( 1 << ( mélység - 1 )); ha ( mélység == 0 ) m [ 0 ] = 0 ; else { //a tömb a bináris szavak decimális jelölését tárolja ( i = 0 ; i < t ; i ++ ) m [ t + i ] = m [ t - i - 1 ] + ( 1 << ( mélység - 1 )); } ha ( mélység != n ) szürke ( n , m , mélység + 1 ); return 0 ; }A 8/16/24/32 bites bináris kód gyors átalakítása Gray kódra C nyelven. (Megjegyzés: az eredményül kapott kód nem teljes Gray kód. Ez a kód 4 bitenként külön-külön konvertál Gray kódra, külön számként kezelve őket Ennek eredményeként az eredményül kapott kód 4 bites Grey kódok halmazából áll.És az egy bit megváltoztatásának szabálya új számra való áttéréskor csak minden 4-en belül tárolódik. egyszerre változik, mivel két tetrádban van változás: 0-> 1 és F->0):
int bin2gray ( int x ) { return x ^ (( x & 0xEEEEEEEE ) >> 1 ); }Ha az érzékelők korlátozott erőforrással rendelkeznek a kapcsolások számát tekintve, akkor szeretném, ha egyenletesen kopnának. Egy kiegyensúlyozott Gray kódban különböző bitekben a kapcsolók száma a lehető legközelebb van.
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 1Itt egy 4 bites kódban minden bit négyszer vált át. Egy 5 bites kódban ez lehetetlen, egy bitet 8-szor kell váltani, a többit 6-szor.
A Gray kód egysávos, ha a mátrix minden oszlopa egymás körkörös eltolása. Ez lehetővé teszi, hogy szögérzékelőt készítsen egy sávval.
A kétbites Gray kód egysávos, ahogy az egy számítógépes egérben is látható , mind a régebbi egerek golyós mechanizmusában, mind az újabb egerek görgőjében. Két érzékelő ugyanazon a pályán különböző pontokon található. Ha ezt a rendszert a végletekig viszi - a lemez fele "fekete", a fele "fehér", és az érzékelők egymáshoz képest 90 ° -os szögben vannak -, akkor a lemez abszolút helyzetét a felbontással megtudhatja. 90 °.
Nagyobb bitmélységű Gray kódoknál ez nem így van, növelni kell a sávok számát, ami az érzékelőt terjedelmessé és drágává teszi. Ezért, ha lehetséges, két sávot mellőzünk – egyet a kétbites Gray kódhoz, egyet pedig a nulla pozícióhoz. Vannak azonban olyan kódok, ahol pontosan egy sáv van, azonban lehetetlen mind a 2 n pozíciót így kódolni. 5 bit esetén a rekord 30 pozíció, 9 és 360 között.
A jelek kvadratúra modulációjában használatos. A szomszédos csillagképpontok egy bittel, az átlósak kettővel különböznek.