Przewodnik po systemie szesnastkowym
System heksadycymalny (szesnastkowy)
System szesnastkowy używa 16 symboli: 0-9 i A-F (A=10, B=11, C=12, D=13, E=14, F=15). Jest skróconym zapisem binarnego - każde 4 bity to jedna cyfra hex. Np. 11111111₂ = FF₁₆ = 255₁₀. Używany w programowaniu i kolorach.
Dlaczego hex jest ważny
Binarnie 255 to 11111111 (8 cyfr). Heksadycymalnie FF (2 znaki) - łatwiejsze do odczytania i wpisywania przez ludzi. Adresy pamięci, kolory RGB, punkty kodowe Unicode używają hex. Definicje kolorów w CSS: #FF0000 (czerwony), #00FF00 (zielony), #0000FF (niebieski).
Praktyczne zastosowania
W CSS kolory: #3498db niebieski, #2ecc342 zielony. W UUID v5: 550e8400-ea29-41d3-af15-6528adf68cc2. Bajty ROM/EEPROM dumpowane jako hex. MAC adresy: aa:bb:cc:dd:ee:ff. W debugerach adresy pamięci jako 0x0040A7C0.
#888 to nie #808080, a skrót CSS obejmuje 0,02% kolorów
Zapis szesnastkowy to zwięźle dwójkowy: jedna cyfra to dokładnie cztery bity, więc dwie cyfry to jeden bajt. Dlatego kolor zapisuje się jako trzy pary. Trzycyfrowy skrót w CSS rozwija się przez podwojenie każdej cyfry, a nie przez skalowanie, co oznacza, że większość kolorów w ogóle nie ma skrótu — w tym szarość średnia.
Jak to działa
- Przelicza między systemem szesnastkowym, dziesiętnym i dwójkowym, gdzie każda cyfra szesnastkowa to cztery bity.
- Obsługuje wartości kolorów, gdzie dwie cyfry szesnastkowe dają 256 poziomów jednego kanału.
- Uwidacznia odpowiedniość cyfra–bity, bo na niej opierają się wszystkie te konwencje.
1 cyfra szesnastkowa = 4 bity = 16 wartości (0–F) 2 cyfry szesnastkowe = 8 bitów = 256 wartości (00–FF) #RRGGBB = 3 kanały × 8 bitów = 24 bity = 16 777 216 kolorów skrót #RGB rozwija się przez podwojenie: #F0A → #FF00AA
Przykład z liczbami
Porównanie pełnej formy sześciocyfrowej ze skrótem trzycyfrowym.
- #RRGGBB to 24 bity: 16 777 216 kolorów
- #RGB to 12 bitów: 4096 kolorów
- skrót pokrywa 0,0244% przestrzeni
- #888 rozwija się do #888888 = 136 na kanał
- ale szarość średnia to #808080 = 128 na kanał
#888 i #808080 różnią się o 8 poziomów w każdym kanale, a żaden kod trzycyfrowy nie daje #808080. Skrót nie jest skrótem wszystkich kolorów — to niewielki podzbiór, który akurat da się zapisać o połowę krócej.
Jak czytać wynik
- Rozwinięcie podwaja cyfrę, a nie skaluje zakresu. #A staje się #AA, a nie wartością umieszczoną proporcjonalnie — dlatego paleta skrótowa trafia na 0x00, 0x11, 0x22 i tak dalej co 17, omijając wszystko pomiędzy.
- System szesnastkowy przetrwał, bo odwzorowanie na binarny jest ścisłe i mechaniczne. Bajt to zawsze dwa znaki, konwersja nie wymaga rachunków i nie ma zaokrąglania, które wprowadziłoby błąd — te same powody stoją za użyciem go do skrótów, adresów MAC i zrzutów pamięci.
- Wielkość liter nie ma znaczenia w wartościach kolorów ani w większości parserów: #FF00AA i #ff00aa są identyczne. Liczy się w skrótach tylko tam, gdzie specyfikacja tak mówi, a porównywanie ciągów szesnastkowych bez ujednolicenia wielkości liter to częste źródło fałszywych niezgodności.
- Przedrostek 0x oznacza zapis szesnastkowy w większości języków programowania, # oznacza go w CSS, a część kontekstów nie używa żadnego. Goły ciąg cyfr i liter jest niejednoznaczny — 10 to dziesięć dziesiętnie i szesnaście szesnastkowo, a same znaki tego nie rozstrzygają.
Częste pytania
- Dlaczego kolory zapisuje się szesnastkowo, a nie dziesiętnie?
- Bo każdy kanał to jeden bajt, a jeden bajt to dokładnie dwie cyfry szesnastkowe. Dziesiętnie ten sam kolor to rgb(255, 0, 170) — trzy liczby o zmiennej długości z separatorami wobec sześciu stałych znaków dzielących się czysto na kanały.
- Czy każdy kolor szesnastkowy da się skrócić?
- Tylko wtedy, gdy każda para to powtórzona cyfra. #FF00AA skraca się do #F0A, bo każda para się powtarza; #808080 nie da się skrócić wcale, bo 80 nie jest podwojoną cyfrą. Skrót ma mniej więcej jeden kolor na 4096.