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: 0x7FFF0000
✅ Debugowanie: 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:
- Lekcja 63: Przeliczanie między dowolnymi systemami
- Konwersje dla dowolnych podstaw (2-36)
- Algorytmy uniwersalne
-
Konwersje bezpośrednie (bez przejścia przez DEC)
-
Lekcja 64: Operacje bitowe w algorytmach
- AND, OR, XOR, NOT
- Przesunięcia bitowe (<<, >>)
-
Maski bitowe i flagi
-
Lekcja 65: Liczby pierwsze - test pierwszości
- Algorytmy sprawdzania pierwszości
- 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