Przeliczanie DEC ↔ HEX

Wprowadzenie

System szesnastkowy (hexadecimal, HEX) to system liczbowy o podstawie 16, szeroko wykorzystywany w programowaniu. Jest szczególnie popularny, ponieważ każda cyfra HEX reprezentuje dokładnie 4 bity binarne, co czyni go idealnym do reprezentacji danych binarnych w kompaktowej formie.

Konwersja DEC ↔ HEX jest kluczowa dla:

  • Adresy pamięci (0x7FFF0000)
  • Kolory w grafice (#FF5733)
  • Debugowanie (zrzuty pamięci, rejestry procesora)
  • Kodowanie znaków (Unicode: U+00A9)
  • Kody błędów (0x80004005)
  • MAC adresy (00:1A:2B:3C:4D:5E)

Podstawy systemu HEX

Cyfry w systemie szesnastkowym

16 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

HEX DEC BIN
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
A 10 1010
B 11 1011
C 12 1100
D 13 1101
E 14 1110
F 15 1111

Notacja

  • Prefiks 0x: standardowa notacja w programowaniu (0xFF, 0x1A3)
  • Prefiks #: w kolorach HTML/CSS (#FF5733)
  • Sufiks h: w assemblerze (FFh)
  • Indeks: w notacji matematycznej (2F₁₆)

HEX → DEC: Konwersja szesnastkowa na dziesiętną

Metoda: Wagi pozycji

Algorytm:

Każda cyfra HEX ma wagę 16^pozycja
Suma: cyfra₀ × 16⁰ + cyfra₁ × 16¹ + ... + cyfraₙ × 16ⁿ

Przykład: 2F₁₆ → DEC

Pozycje:  1  0
Cyfry:    2  F (15)

Obliczenia:
  2 × 16¹ = 2 × 16  = 32
  F × 16⁰ = 15 × 1  = 15
                      ---
  Suma            = 47₁₀

Implementacja: HEX → DEC

Wyjście:

=== HEX → DEC ===

0               →            0 (weryfikacja:            0) ✓
F               →           15 (weryfikacja:           15) ✓
10              →           16 (weryfikacja:           16) ✓
2F              →           47 (weryfikacja:           47) ✓
FF              →          255 (weryfikacja:          255) ✓
1A3             →          419 (weryfikacja:          419) ✓
0xDEADBEEF      →   3735928559 (weryfikacja:   3735928559) ✓

Metoda 2: Schemat Hornera (optymalizacja)

Wyjście:

=== HEX → DEC (schemat Hornera) ===

0               →            0 ✓
F               →           15 ✓
10              →           16 ✓
2F              →           47 ✓
FF              →          255 ✓
1A3             →          419 ✓
0xDEADBEEF      →   3735928559 ✓

HEX → DEC z wizualizacją kroków

Wyjście:

=== HEX → DEC (wizualizacja) ===

Konwersja: 0x2F → DEC

Początek: decimal = 0

Krok 1: cyfra='2' (wartość=2)
  decimal = 0 × 16 + 2 = 2

Krok 2: cyfra='F' (wartość=15)
  decimal = 2 × 16 + 15 = 47

Wynik: 0x2F = 47₁₀

DEC → HEX: Konwersja dziesiętna na szesnastkową

Metoda: Dzielenie przez 16

Algorytm: 1. Dziel liczbę przez 16 2. Zapisz resztę (0-15) i zamień na cyfrę HEX (0-9, A-F) 3. Kontynuuj z wynikiem dzielenia 4. Zatrzymaj się gdy wynik = 0 5. Odczytaj cyfry od dołu do góry

Przykład: 255₁₀ → HEX

255 ÷ 16 = 15 reszta 15 → F  ← najmłodsza cyfra
 15 ÷ 16 =  0 reszta 15 → F  ← najstarsza cyfra

Wynik (od dołu): FF₁₆

Implementacja: DEC → HEX

Wyjście:

=== DEC → HEX ===

     0 → 0          (weryfikacja: 0         ) ✓
    10 → A          (weryfikacja: A         ) ✓
    15 → F          (weryfikacja: F         ) ✓
    16 → 10         (weryfikacja: 10        ) ✓
    47 → 2F         (weryfikacja: 2F        ) ✓
   100 → 64         (weryfikacja: 64        ) ✓
   255 → FF         (weryfikacja: FF        ) ✓
   256 → 100        (weryfikacja: 100       ) ✓
  4095 → FFF        (weryfikacja: FFF       ) ✓
 65535 → FFFF       (weryfikacja: FFFF      ) ✓

DEC → HEX z wizualizacją kroków

Wyjście:

=== DEC → HEX (wizualizacja) ===

Konwersja: 419₁₀ → HEX

Krok 1: 419 ÷ 16 = 26 reszta 3 → '3'
Krok 2: 26 ÷ 16 = 1 reszta 10 → 'A'
Krok 3: 1 ÷ 16 = 0 reszta 1 → '1'

Odczytaj cyfry od dołu do góry: 1A3
Wynik: 419₁₀ = 1A3₁₆ (0x1A3)

Praktyczne zastosowania

1. Konwersja kolorów RGB ↔ HEX

Wyjście:

=== Kolory RGB ↔ HEX ===

Czerwony        RGB(255,   0,   0) → #FF0000 → RGB(255, 0, 0)
Zielony         RGB(  0, 255,   0) → #00FF00 → RGB(0, 255, 0)
Niebieski       RGB(  0,   0, 255) → #0000FF → RGB(0, 0, 255)
Żółty           RGB(255, 255,   0) → #FFFF00 → RGB(255, 255, 0)
Pomarańczowy    RGB(255, 165,   0) → #FFA500 → RGB(255, 165, 0)
Fioletowy       RGB(128,   0, 128) → #800080 → RGB(128, 0, 128)

2. Formatowanie adresów pamięci

Wyjście:

=== Adresy pamięci ===

Adres DEC       Adres HEX (32-bit)
-----------------------------------
0               0x00000000
255             0x000000FF
4096            0x00001000
65535           0x0000FFFF
1048576         0x00100000
2147483647      0x7FFFFFFF

3. Dekodowanie wartości HEX z plików

Wyjście:

=== Dekodowanie HEX dump ===

HEX: 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
DEC: [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
ASCII: 'Hello, World!'

Relacja HEX ↔ BIN

Konwersja bezpośrednia HEX ↔ BIN

1 cyfra HEX = dokładnie 4 bity BIN

Wyjście:

=== HEX ↔ BIN (bezpośrednia konwersja) ===

HEX: F      → BIN: 1111                 → HEX: F
HEX: 2F     → BIN: 101111               → HEX: 2F
HEX: FF     → BIN: 11111111             → HEX: FF
HEX: 1A3    → BIN: 110100011            → HEX: 1A3
HEX: CAFE   → BIN: 1100101011111110     → HEX: CAFE

Kompletny konwerter DEC ↔ HEX

Wyjście:

=== Kompletny konwerter DEC ↔ HEX ===

HEX → DEC:
  0xFF            → 255
  #00FF00         → 65280
  DEADBEEF        → 3735928559

DEC → HEX (różne formaty):
  255 → 0xFF
  255 → 0xff
  255 → #FF
  255 → FF
  255 → 0x000000FF

Złożoność obliczeniowa

Analiza złożoności

Operacja Metoda Złożoność czasowa Złożoność pamięciowa
HEX → DEC Wagi pozycji O(n) O(1)
HEX → DEC Schemat Hornera O(n) O(1)
DEC → HEX Dzielenie przez 16 O(log₁₆ m) O(log₁₆ m)

gdzie: - n = liczba cyfr w HEX - m = wartość liczby dziesiętnej

Uwaga: n ≈ log₁₆(m), więc złożoności są porównywalne!


Podsumowanie

Kluczowe algorytmy

Konwersja Algorytm Zalety
HEX → DEC Schemat Hornera Szybki, bez potęgowania
DEC → HEX Dzielenie przez 16 Standardowy, niezawodny
HEX ↔ BIN Mapowanie bezpośrednie Bardzo szybkie (1 cyfra = 4 bity)

Praktyczne zastosowania

Kolory: RGB ↔ HEX (#FF5733) ✅ Adresy pamięci: 0x7FFF0000Debugowanie: zrzuty pamięci, rejestry ✅ Kodowanie: Unicode, ASCII ✅ Sieci: MAC adresy ✅ Kryptografia: klucze, hashe

Kluczowe fakty

  • 1 cyfra HEX = 4 bity BIN (hexadecimal nibble)
  • 2 cyfry HEX = 1 bajt (00-FF = 0-255)
  • HEX jest kompaktową reprezentacją binarną
  • Używany w niskopoziomowym programowaniu

Co dalej?

Po opanowaniu DEC ↔ HEX, następne kroki to:

  1. Lekcja 63: Przeliczanie między dowolnymi systemami
  2. Konwersje dla dowolnych podstaw (2-36)
  3. Algorytmy uniwersalne
  4. Konwersje bezpośrednie (bez przejścia przez DEC)

  5. Lekcja 64: Operacje bitowe w algorytmach

  6. AND, OR, XOR, NOT
  7. Przesunięcia bitowe (<<, >>)
  8. Maski bitowe i flagi

  9. Lekcja 65: Liczby pierwsze - test pierwszości

  10. Algorytmy sprawdzania pierwszości
  11. Optymalizacje

Zadania praktyczne

Zadanie 1: Kalkulator kolorów

Napisz program konwertujący kolory między formatami: - RGB (255, 165, 0) - HEX (#FFA500) - HSL (Hue, Saturation, Lightness)

Zadanie 2: Analizator pamięci

Stwórz funkcję parsującą zrzuty pamięci w formacie HEX i wyświetlającą je jako: - Wartości dziesiętne - Tekst ASCII - Reprezentację binarną

Zadanie 3: Konwerter Unicode

Zaimplementuj konwerter między znakami Unicode a ich reprezentacją HEX (np. '©' ↔ 'U+00A9').

Zadanie 4: Validator MAC adresów

Napisz funkcję walidującą i formatującą adresy MAC (np. 00:1A:2B:3C:4D:5E).


Następna lekcja: Przeliczanie między dowolnymi systemami - konwersje uniwersalne