Grejov kod
U običnom binarnom sistemu, brojanje od 7 (0111) do 8 (1000) obrće četiri bita odjednom. Ako te bitove čita mehanički enkoder ili ih takt uzorkuje dok se menjaju, može da se pojavi bilo koja mešavina starih i novih bitova, a trenutno 1111 (15) je velika greška. Grejov kod (reflektovani binarni kod) uređuje brojeve tako da se uzastopne vrednosti razlikuju u tačno jednom bitu. Koriste ga rotacioni enkoderi, Karnoove mape, neki ADC-ovi i šeme za ispravljanje grešaka.
Konverzija je jedan red u svakom smeru:
gray = n ^ (n >> 1)
binary = g; while (g >>= 1) binary ^= g; // XOR sa svim pomeranjima udesno BCD
Binarno kodirani decimalni zapis (BCD) čuva svaku decimalnu cifru u zasebnom 4-bitnom niblu: 1234 postaje 0001 0010 0011 0100, što je 0x1234 kao heks broj. Troši nešto prostora (niblovi A–F se nikad ne koriste), ali čini decimalni prikaz i tačnu decimalnu aritmetiku trivijalnim, zbog čega ga koriste satovi, kalkulatori, finansijski COBOL i čip sata realnog vremena u svakom PC-ju. Čitanje BCD bajta kao običnog binarnog broja daje besmislicu, što je uobičajena greška.
Popcount i parnost
Hamingova težina (popcount) je broj bitova sa vrednošću 1. To je jedna instrukcija na modernim procesorima (POPCNT) i osnova Hamingovog rastojanja, kardinalnosti bitseta i nekih trikova za heširanje. Parnost je popcount mod 2; bit parnosti je najjednostavniji kod za otkrivanje grešaka i hvata svaki pojedinačno obrnuti bit.
// Kernigenov trik: svaki korak briše najniži postavljeni bit
int count = 0; while (n) { n &= n - 1; count++; } Pitanja
Zašto rotacioni enkoderi koriste Grejov kod?
Između dve susedne pozicije menja se samo jedan kontakt, pa je očitavanje usred prelaza uvek jedna od dve susedne vrednosti, nikad nasumična. Binarni enkoderi mogu da pokažu bilo koju vrednost tokom prelaza u kome se menja više bitova.
Da li je Grejov kod jedinstven?
Reflektovani binarni kod je standardni, ali svako uređenje u kome se susedi razlikuju u jednom bitu je „neki“ Grejov kod. Postoje balansirani i n-arni Grejovi kodovi za posebne namene.
Kako da pretvorim BCD u binarno u kodu?
Uzmite svaki nibl kao cifru: value = value*10 + nibble, od najznačajnijeg nibla nadole. Ili, za dvocifrene bajtove, ((b >> 4) * 10) + (b & 0x0F). Mnogi RTC čipovi zahtevaju upravo ovo.
Koji je najbrži način da se prebroje bitovi?
Koristite ugrađenu funkciju: __builtin_popcount (C), bits.OnesCount (Go), int.bit_count() (Python 3.10+), u32::count_ones (Rust). One se prevode u jednu instrukciju tamo gde postoji.