System liczb szesnastkowych, często nazywany też szesnastkowym (ang. hexadecimal, skrót: hex), jest systemem liczbowym składającym się z 16 symboli (podstawa 16). W standardowym systemie dziesiętnym (dziesiętnym) używamy dziesięciu znaków: 0–9. W systemie szesnastkowym oprócz cyfr 0–9 stosuje się jeszcze sześć liter alfabetu: alfabetu angielskiego, a konkretnie A, B, C, D, E i F, które odpowiadają wartościom dziesiętnym 10–15 (A = 10, B = 11, …, F = 15). Każda pozycja w zapisie szesnastkowym ma wagę będącą kolejną potęgą 16 (… , 16^2, 16^1, 16^0).

Dlaczego używa się systemu szesnastkowego? Ludzie najczęściej używają systemu dziesiętnego — prawdopodobnie dlatego, że mamy dziesięć palców. Komputery natomiast operują dwoma stanami: włączony/wyłączony, co daje system binarny (0 i 1). Ciągi bitów (np. 11011011) bywają długie, więc wygodnie jest je grupować. W przeszłości grupowano je po 3 bity (stąd powiązanie z ósemkowym systemem), ponieważ 3 bity reprezentują osiem stanów (0–7). Z czasem, przy rosnącej popularności architektur bazujących na bajtach i ich wielokrotnościach, wygodniej stało się grupować po 4 bity: 4 bity dają 16 różnych kombinacji, czyli dokładnie tyle, ile symboli ma system szesnastkowy.

W żargonie komputerowym cztery bity nazywane są nibble (czasem nybble). Jeden nibble odpowiada jednej cyfrze w systemie szesnastkowym (0–9, A–F). Dwie nibble tworzą bajt (8 bitów). Ponieważ wiele operacji komputerowych odbywa się na bajtach lub ich wielokrotnościach (16, 32, 64 bity itp.), zapis w systemie szesnastkowym znacznie upraszcza prezentację i analizę danych binarnych.

Przyporządkowanie i powiązanie z binarnym

  • Każda cyfra szesnastkowa odpowiada dokładnie 4 bitom (np. 0 = 0000, 1 = 0001, …, F = 1111).
  • Przykłady odwzorowania: 0x0 = 0000, 0x1 = 0001, 0x2 = 0010, 0x3 = 0011, 0x4 = 0100, 0x5 = 0101, 0x6 = 0110, 0x7 = 0111, 0x8 = 1000, 0x9 = 1001, 0xA = 1010, 0xB = 1011, 0xC = 1100, 0xD = 1101, 0xE = 1110, 0xF = 1111.
  • Dzięki temu konwersja między binarnym a szesnastkowym polega na dzieleniu ciągu bitów na grupy po 4 od prawej strony i zamianie każdej grupy na odpowiadającą jej cyfrę hex.

Konwersje — przykłady i metody

Konwersja z systemu szesnastkowego na dziesiętny: należy rozwinąć liczbę jako sumę cyfr razy potęgi 16. Przykład: 3A716 = 3·16^2 + A·16^1 + 7·16^0 = 3·256 + 10·16 + 7 = 768 + 160 + 7 = 93510.

Konwersja z dziesiętnego na szesnastkowy: stosuje się dzielenie przez 16 i zapis reszt. Przykład: 202110:

  • 2021 ÷ 16 = 126 reszty 5 → najmniej znacząca cyfra = 5
  • 126 ÷ 16 = 7 reszty 14 → reszta 14 = E
  • 7 ÷ 16 = 0 reszty 7 → kolejna cyfra = 7
Wynik: 202110 = 7E516.

Praktyczny przykład odczytu: zapis 63h lub 0x63 oznacza liczbę zapisaną w systemie szesnastkowym. 0x63 = 6·16 + 3 = 96 + 3 = 9910. W językach programowania najczęściej spotykane są przedrostki 0x (C, C++, Python, Java) lub przedrostek/sufiks zależny od środowiska (np. sufiks h w asemblerze). Wiele narzędzi akceptuje zarówno małe, jak i wielkie litery A–F (bez rozróżniania wielkości znaków).

Zastosowania praktyczne

  • Adresowanie pamięci i debugowanie niskopoziomowe — adresy często zapisuje się w hex dla czytelności.
  • Kolory w grafice i na stronach WWW — kody barw w formacie #RRGGBB są podawane w szesnastkowym (np. #FF0000 = czerwony).
  • Reprezentacja danych binarnych — hex skraca zapis długich ciągów bitów (np. bajty logów, zrzuty pamięci).
  • Protokóły sieciowe, sumy kontrolne, kryptografia — wartości i identyfikatory często prezentuje się w hex.
  • Programowanie niskopoziomowe i asembler — instrukcje, maski bitowe i stałe często wyrażane w hex.

Uwagi praktyczne i konwencje

  • Notacje: popularne konwencje zapisu to 0xA3, A3h (w niektórych asemblerach) oraz zapis bezpośredni (np. #A3) zależnie od środowiska.
  • Jeśli zapis zaczyna się od litery (np. A3h), w niektórych dialektach asemblera trzeba poprzedzić go zerem (0A3h), żeby uniknąć pomyłek z identyfikatorami.
  • Operacje arytmetyczne w hex działają tak samo jak w innych systemach pozycyjnych — dodajemy kolumny cyfr z przeniesieniem (carried) przy przekroczeniu 16.
  • W większości narzędzi i języków programowania litery A–F są case-insensitive (A lub a = 10).

System szesnastkowy jest zatem narzędziem ułatwiającym pracę z danymi binarnymi: jest czytelniejszy dla ludzi niż długie ciągi zer i jedynek, a jednocześnie ma prostą, ścisłą relację z systemem binarnym dzięki grupowaniu po 4 bity.