Przeliczanie między dowolnymi systemami

Wprowadzenie

Do tej pory poznaliśmy konwersje między konkretnymi systemami (BIN ↔ DEC, DEC ↔ HEX). Teraz nauczymy się uniwersalnych algorytmów, które działają dla dowolnej podstawy (2-36, a nawet większych).

Umiejętność konwersji między dowolnymi systemami jest przydatna w:

  • Systemach nietypowych (np. base58 w Bitcoin, base64 w kodowaniu)
  • Kompresji danych (reprezentacje o wyższych podstawach)
  • Kryptografii (kodowanie kluczy, hashy)
  • Optymalizacji (wybór optymalnej podstawy dla danych)
  • Matematyce komputerowej (arytmetyka w różnych podstawach)

Teoria konwersji między systemami

Trzy podejścia do konwersji

1. Przez system dziesiętny (pośredni)

System A → DEC → System B
  • Najprostsze
  • Dwa kroki konwersji
  • Uniwersalne

2. Bezpośrednie (przez BIN)

System A → BIN → System B
  • Dla systemów będących potęgami 2 (BIN, OCT, HEX)
  • Bardzo szybkie
  • Ograniczone zastosowanie

3. Bezpośrednie (matematyczne)

System A → System B (bezpośrednio)
  • Złożone matematycznie
  • Najszybsze
  • Rzadko używane w praktyce

Uniwersalne algorytmy konwersji

1. Z dowolnej podstawy → DEC

Algorytm: Schemat Hornera (uniwersalny)

Dla liczby w systemie o podstawie 'base':
  result = 0
  dla każdej cyfry (od lewej do prawej):
    result = result * base + wartość_cyfry

Przykład: 231₅ → DEC

base = 5

result = 0
result = 0 * 5 + 2 = 2
result = 2 * 5 + 3 = 13
result = 13 * 5 + 1 = 66

Wynik: 231₅ = 66₁₀

Implementacja: ANY → DEC

Wyjście:

=== Konwersja z różnych systemów → DEC ===

1010   (base  2, binarny        ) →     10 (DEC)
231    (base  5, piątkowy       ) →     66 (DEC)
77     (base  8, ósemkowy       ) →     63 (DEC)
FF     (base 16, szesnastkowy   ) →    255 (DEC)
Z      (base 36, base-36        ) →     35 (DEC)
123    (base  4, czwórkowy      ) →     27 (DEC)

2. DEC → dowolna podstawa

Algorytm: Dzielenie przez podstawę

Dla konwersji na system o podstawie 'base':
  dopóki liczba > 0:
    reszta = liczba % base
    dodaj cyfrę odpowiadającą reszcie
    liczba = liczba // base
  odwróć kolejność cyfr

Przykład: 66₁₀ → base 5

66 ÷ 5 = 13 reszta 1 → '1'
13 ÷ 5 = 2  reszta 3 → '3'
2  ÷ 5 = 0  reszta 2 → '2'

Wynik (od dołu): 231₅

Implementacja: DEC → ANY

Wyjście:

=== Konwersja DEC → różne systemy ===

DEC    | base  2 | base  5 | base  8 | base 12 | base 16 | base 36
-----------------------------------------------------------------
10     |    1010 |      20 |      12 |       A |       A |       A
42     |  101010 |     132 |      52 |      36 |      2A |      16
100    | 1100100 |     400 |     144 |      84 |      64 |      2S
255    |11111111 |    2010 |     377 |     193 |      FF |      73
1000   |11111010|   13000 |    1750 |     6B4 |     3E8 |      RS
       |   00   |         |         |         |         |

Konwersja bezpośrednia ANY → ANY

Metoda 1: Przez DEC (dwuetapowa)

Najprostsza i najczęściej używana metoda:

Wyjście:

=== Konwersja bezpośrednia ANY → ANY ===

BIN → HEX            | 1010       (base  2) → A          (base 16)
HEX → BIN            | FF         (base 16) → 11111111   (base  2)
OCT → DEC            | 77         (base  8) → 63         (base 10)
DEC → base-5         | 100        (base 10) → 400        (base  5)
base-36 → DEC        | Z          (base 36) → 35         (base 10)
BIN → OCT            | 1111       (base  2) → 17         (base  8)

Konwersja dla potęg dwójki (optymalizacja)

BIN ↔ OCT ↔ HEX (bezpośrednia)

Dla systemów będących potęgami 2 (2, 4, 8, 16, 32...) możliwa jest konwersja bez obliczeń:

BIN (2¹) ↔ OCT (2³) ↔ HEX (2⁴)

1 cyfra OCT = 3 bity BIN
1 cyfra HEX = 4 bity BIN

Implementacja: Konwersja między potęgami 2

Wyjście:

=== Konwersja między potęgami 2 (optymalizacja) ===

1111   (base  2) → 33              (base  4)
1111   (base  2) → 17              (base  8)
FF     (base 16) → 11111111        (base  2)
FF     (base 16) → 377             (base  8)
77     (base  8) → 3F              (base 16)

Systemy o większych podstawach

Base-64 (kodowanie danych)

Wyjście:

=== Base-64 (kodowanie) ===

DEC        Base-64         Weryfikacja
----------------------------------------
0          A               0            ✓
10         K               10           ✓
63         /               63           ✓
64         BA              64           ✓
100        Bk              100          ✓
1000       Po              1000         ✓
4095       //              4095         ✓

Kompletny uniwersalny konwerter

Wyjście:

=== Uniwersalny konwerter (base 2-62) ===

1010       (base  2) → 10                   (base 10)
FF         (base 16) → 11111111             (base  2)
100        (base 10) → 202                  (base  7)
Z          (base 36) → 35                   (base 10)
hello      (base 36) → 29234652             (base 10)

Konwersja: CAFE (base 16) → base 8
--------------------------------------------------
Krok 1: CAFE (base 16) → 51966 (DEC)
Krok 2: 51966 (DEC) → 145376 (base 8)

Wynik: CAFE (base 16) = 145376 (base 8)

Praktyczne zastosowania

1. Kodowanie Base58 (Bitcoin)

Wyjście:

=== Base58 (Bitcoin) ===

0            → 1          →            0 ✓
57           → z          →           57 ✓
58           → 21         →           58 ✓
100          → 2W         →          100 ✓
1000         → He         →         1000 ✓
123456789    → BukQL      →    123456789 ✓

2. Walidator liczb w różnych systemach

Wyjście:

=== Walidacja liczb ===

1010   (base  2): ✓ OK
1012   (base  2): ✗ Nieprawidłowa cyfra '2' na pozycji 3 dla podstawy 2
FF     (base 16): ✓ OK
FG     (base 16): ✗ Nieprawidłowa cyfra 'G' na pozycji 1 dla podstawy 16
789    (base  8): ✗ Nieprawidłowa cyfra '8' na pozycji 1 dla podstawy 8
123    (base 10): ✓ OK

Złożoność obliczeniowa

Analiza złożoności

Operacja Złożoność czasowa Złożoność pamięciowa
ANY → DEC O(n) O(1)
DEC → ANY O(logₐ m) O(logₐ m)
ANY → ANY (przez DEC) O(n + logₐ m) O(logₐ m)
Potęgi 2 → Potęgi 2 O(n) O(n)

gdzie: - n = liczba cyfr w systemie źródłowym - m = wartość liczby - a = podstawa systemu docelowego


Podsumowanie

Kluczowe algorytmy

Konwersja Metoda Zalety
ANY → DEC Schemat Hornera Uniwersalny, prosty
DEC → ANY Dzielenie przez podstawę Standardowy algorytm
ANY → ANY Przez DEC (2 kroki) Najprostszy w implementacji
Potęgi 2 Przez BIN (mapowanie) Bardzo szybki

Praktyczne zastosowania

Kodowanie danych: Base64, Base58, Base32 ✅ Kryptografia: Reprezentacja kluczy i hashy ✅ Kompresja: Wyższe podstawy = krótsza reprezentacja ✅ Matematyka: Arytmetyka w różnych podstawach ✅ Bitcoin/krypto: Base58 dla adresów

Kluczowe fakty

  • Każda podstawa ≥ 2 może reprezentować dowolną liczbę
  • Wyższa podstawa = krótsza reprezentacja
  • Potęgi 2 pozwalają na konwersję bez obliczeń
  • Base-64 szeroko używany do kodowania danych

Co dalej?

Po opanowaniu konwersji między systemami, następne kroki to:

  1. Lekcja 64: Operacje bitowe w algorytmach
  2. AND, OR, XOR, NOT
  3. Przesunięcia bitowe
  4. Maski i flagi

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

  6. Algorytmy sprawdzania pierwszości
  7. Optymalizacje

  8. Lekcja 66: Sito Eratostenesa

  9. Generowanie liczb pierwszych
  10. Optymalizacje pamięciowe

Zadania praktyczne

Zadanie 1: Kalkulator systemów

Napisz interaktywny kalkulator konwertujący między dowolnymi systemami (2-62) z interfejsem CLI.

Zadanie 2: Base64 encoder

Zaimplementuj własny encoder/decoder Base64 zgodny ze standardem RFC 4648.

Zadanie 3: Arytmetyka w różnych podstawach

Napisz funkcje dodawania i mnożenia liczb bezpośrednio w wybranej podstawie (bez konwersji na DEC).

Zadanie 4: Optymalizacja reprezentacji

Znajdź optymalną podstawę dla danego zestawu liczb, minimalizującą łączną długość reprezentacji.


Następna lekcja: Operacje bitowe w algorytmach - AND, OR, XOR, przesunięcia