Algorytmy

Systemy liczbowe na maturze: binarny, ósemkowy (oct) i szesnastkowy – konwersje Python i C++

KI

KursInformatyka

Eksperci od przygotowania do matury z informatyki

25 min
Obraz główny artykułu: Systemy liczbowe na maturze: binarny, ósemkowy (oct) i szesnastkowy – konwersje Python i C++

Zrozumienie systemów liczbowych to absolutny fundament na maturze z informatyki. Niezależnie od tego, czy rozwiązujesz zadania w arkuszu kalkulacyjnym, piszesz własny kod, czy analizujesz pseudokod – konwersja systemów liczbowych pojawia się niemal co roku. Choć na co dzień posługujemy się systemem dziesiętnym, komputery 'myślą' w innych bazach. W tym artykule rozłożymy na czynniki pierwsze system binarny, system octalny oraz system heksadecymalny. Pokażemy Ci, jak działa zamiana na system dziesiętny i jak zaprogramować te operacje w Pythonie i C++.

Czym są pozycyjne systemy liczbowe?

Zanim przejdziemy do kodu, musisz zrozumieć jedną, najważniejszą zasadę, na której opiera się cała matematyka systemów pozycyjnych. W każdym systemie pozycyjnym wartość cyfry zależy od jej pozycji w liczbie. Każda pozycja to kolejna potęga podstawy systemu.

Wzór ogólny na wartość liczby w dowolnym systemie pozycyjnym o podstawie p zapisujemy jako:

Wartość = c_n · p^n + c_{n-1} · p^{n-1} + … + c_1 · p¹ + c_0 · p⁰

Gdzie c to kolejne cyfry liczby (od prawej do lewej, zaczynając od indeksu 0), a p to podstawa systemu (np. 2, 8, 10 lub 16).

Przegląd najważniejszych systemów na maturze

SystemPodstawaDostępne cyfryZastosowanie
Dziesiętny (Dec)100, 1, 2, 3, 4, 5, 6, 7, 8, 9Codzienne życie człowieka
Binarny (Bin)20, 1Podstawa działania komputerów (bity)
Ósemkowy (Oct)80, 1, 2, 3, 4, 5, 6, 7Uprawnienia w systemach Linux (chmod)
Szesnastkowy (Hex)160-9 oraz A, B, C, D, E, FAdresy pamięci, kolory w HTML/CSS

Uwaga na litery w systemie Hex!

W systemie szesnastkowym brakuje nam cyfr arabskich dla wartości od 10 do 15. Dlatego używamy liter: A=10, B=11, C=12, D=13, E=14, F=15. Pamiętaj o tym podczas konwersji systemów!

Zamiana na system dziesiętny (z dowolnego innego)

Zamiana na system dziesiętny to najprostsza operacja, jeśli tylko pamiętasz wzór, o którym mówiliśmy wcześniej. Nazywamy to metodą wielomianową (lub rozwinięciem wielomianowym). Mnożymy każdą cyfrę przez podstawę systemu podniesioną do potęgi odpowiadającej pozycji tej cyfry.

Z binarnego na dziesiętny

Weźmy liczbę binarną 10110₂. Przypiszmy potęgi od prawej strony (zaczynając od 0):

  • Cyfra 0: pozycja 0, waga 2⁰ = 1
  • Cyfra 1: pozycja 1, waga 2¹ = 2
  • Cyfra 1: pozycja 2, waga 2² = 4
  • Cyfra 0: pozycja 3, waga 2³ = 8
  • Cyfra 1: pozycja 4, waga 2⁴ = 16

Obliczenie: 1 · 16 + 0 · 8 + 1 · 4 + 1 · 2 + 0 · 1 = 16 + 4 + 2 = 22

Z systemu oct (ósemkowego) na dziesiętny

System ósemkowy używa podstawy 8. Konwersja wygląda identycznie, zmieniamy tylko wagę pozycji. Weźmy liczbę 345₈:

Obliczenie: 3 · 8² + 4 · 8¹ + 5 · 8⁰ = 3 · 64 + 4 · 8 + 5 · 1 = 192 + 32 + 5 = 229

Z systemu heksadecymalnego na dziesiętny

Tutaj podstawa to 16. Zamieńmy liczbę 2F₁₆ na dziesiętny. Pamiętamy, że F = 15:

Obliczenie: 2 · 16¹ + 15 · 16⁰ = 32 + 15 = 47

Zamiana z systemu dziesiętnego na dowolny inny

Ten proces wymaga użycia operacji dzielenia całkowitego (div) oraz reszty z dzielenia (modulo). Algorytm polega na ciągłym dzieleniu liczby dziesiętnej przez podstawę docelowego systemu i spisywaniu reszt. Gdy osiągniemy 0, odczytujemy spisane reszty z dołu do góry (od tyłu).

Przykład: zamiana 45 na system binarny

  1. 45 / 2 = 22, reszta 1
  2. 22 / 2 = 11, reszta 0
  3. 11 / 2 = 5, reszta 1
  4. 5 / 2 = 2, reszta 1
  5. 2 / 2 = 1, reszta 0
  6. 1 / 2 = 0, reszta 1

Czytając reszty od dołu do góry otrzymujemy: 101101₂.

Schemat Hornera

W zadaniach maturalnych, zarówno zamiana na system dziesiętny, jak i z dziesiętnego, bardzo często optymalizowana jest za pomocą schematu Hornera, który zmniejsza liczbę potrzebnych mnożeń. Zdecydowanie warto go znać, zwłaszcza w zadaniach algorytmicznych wymagających optymalizacji.

Szybka konwersja: Binarny ↔ Octalny ↔ Heksadecymalny

Nie musisz zamieniać liczby binarnej na dziesiętną, żeby przejść na system ósemkowy lub szesnastkowy! Wynika to z faktu, że 8 to 2³, a 16 to 2⁴. Możemy pogrupować bity.

Binarny na Oct (grupowanie po 3 bity)

Grupujemy bity liczby od prawej do lewej w trójki. Jeśli brakuje bitów na początku, dopisujemy zera. Następnie każdą trójkę zamieniamy na cyfrę od 0 do 7.

Liczba: 10110111₂

  • Grupy: (010) (110) (111)
  • Wartości: 010₂ = 2, 110₂ = 6, 111₂ = 7
  • Wynik: 267₈

Binarny na Hex (grupowanie po 4 bity)

Zasada jest analogiczna, ale grupujemy w czwórki.

Liczba: 10110111₂

  • Grupy: (1011) (0111)
  • Wartości: 1011₂ = 11 (czyli B), 0111₂ = 7
  • Wynik: B7₁₆

Implementacja w Pythonie (wbudowana i ręczna)

Python posiada potężne funkcje wbudowane do konwersji systemów liczbowych. Na maturze możesz z nich korzystać, chyba że w poleceniu wyraźnie zażądano napisania własnego algorytmu od zera (częsty przypadek w zadaniach z programowania!).

Funkcje wbudowane

# Zamiana na dziesiętny z innych (używając int)
liczba_bin = "101101"
liczba_oct = "55"
liczba_hex = "2D"

print(int(liczba_bin, 2))  # Wynik: 45
print(int(liczba_oct, 8))  # Wynik: 45
print(int(liczba_hex, 16)) # Wynik: 45

# Zamiana z dziesiętnego na inne systemy
liczba_dec = 45

print(bin(liczba_dec))  # Wynik: '0b101101' (0b oznacza system binarny)
print(oct(liczba_dec))  # Wynik: '0o55' (0o oznacza system octalny)
print(hex(liczba_dec))  # Wynik: '0x2d' (0x2d oznacza system heksadecymalny)

# Aby pozbyć się przedrostków (0b, 0o, 0x), możemy użyć wycinków:
print(bin(liczba_dec)[2:]) # Wynik: '101101'
python

Własny algorytm (wymagany do pełnego zrozumienia)

A co jeśli CKE zabroni użycia wbudowanych funkcji? Zobaczmy manualną implementację konwersji.

def dec_do_dowolnego(liczba, podstawa):
    if liczba == 0:
        return "0"
        
    cyfry_hex = "0123456789ABCDEF"
    wynik = ""
    
    while liczba > 0:
        reszta = liczba % podstawa
        wynik = cyfry_hex[reszta] + wynik  # dopisujemy od przodu!
        liczba = liczba // podstawa
        
    return wynik

# Testujemy
print(dec_do_dowolnego(45, 2))  # '101101'
print(dec_do_dowolnego(45, 8))  # '55'
print(dec_do_dowolnego(45, 16)) # '2D'
python

Implementacja w C++

C++ również posiada narzędzia ułatwiające konwersję (np. stoi lub manipulatory strumienia), ale manualna implementacja bywa bezpieczniejsza na arkuszach egzaminacyjnych, gdzie kontrola nad typami danych jest kluczowa.

Wbudowane konwersje

#include <iostream>
#include <string>

using namespace std;

int main() {
    // Z dziesiętnego na Hex i Oct za pomocą manipulatorów
    int liczba = 45;
    cout << "Hex: " << hex << uppercase << liczba << endl; // '2D'
    cout << "Oct: " << oct << liczba << endl;              // '55'
    
    // Z innych na dziesiętny za pomocą stoi
    string s_bin = "101101";
    string s_hex = "2D";
    
    // 0 - indeks początku, 2/16 - podstawa systemu
    int z_bin = stoi(s_bin, nullptr, 2);
    int z_hex = stoi(s_hex, nullptr, 16);
    
    cout << dec; // powrót do wyświetlania w dziesiętnym
    cout << "Z binarnego: " << z_bin << endl; // 45
    
    return 0;
}
cpp

Własny algorytm (z dowolnego na dziesiętny)

Zrealizujemy zamianę na system dziesiętny klasycznym algorytmem iteracyjnym po znakach.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

int na_dziesietny(string liczba, int podstawa) {
    int wynik = 0;
    int potega = 0;
    
    // Idziemy od końca stringa (od najmniej znaczącej cyfry)
    for(int i = liczba.length() - 1; i >= 0; i--) {
        int wartosc_cyfry;
        
        // Zamiana znaku na wartość liczbową
        if(liczba[i] >= '0' && liczba[i] <= '9') {
            wartosc_cyfry = liczba[i] - '0';
        } else {
            // Obsługa liter A-F
            wartosc_cyfry = liczba[i] - 'A' + 10;
        }
        
        // UWAGA: pow() zwraca zmiennoprzecinkową wartość, dla dużych liczb lepiej użyć wbudowanego mnożenia
        wynik += wartosc_cyfry * pow(podstawa, potega);
        potega++;
    }
    
    return wynik;
}

int main() {
    cout << na_dziesietny("101101", 2) << endl; // 45
    cout << na_dziesietny("2D", 16) << endl;    // 45
    return 0;
}
cpp

Typowe zadanie maturalne z rozwiązaniem

📋

Zadanie maturalne: Podsumowanie systemów

Dane jest zapytanie: Posiadasz plik tekstowy liczby.txt, w którym w każdym wierszu znajduje się para: liczba oraz baza systemu, w którym została zapisana (od 2 do 16). Napisz program, który znajdzie w pliku i wypisze liczbę o największej wartości dziesiętnej.

Przykład wejścia:
1011 2
15 8
A 16

Odpowiedź dla przykładu: 15 8 (ponieważ w dziesiętnym to 13, a 1011 w binarce to 11, natomiast A w hex to 10).

Jak podejść do tego problemu? Najlepszym sposobem jest zamiana każdej wczytanej liczby na system dziesiętny w celu znalezienia największej wartości, a jednocześnie musimy pamiętać oryginalny ciąg znaków, aby go poprawnie wypisać.

Rozwiązanie krok po kroku w Pythonie

def znajdz_najwieksza(dane_wejsciowe):
    max_wartosc = -1
    max_oryginal = ""
    
    # Zakładamy, że dane_wejsciowe to lista krotek [('1011', 2), ('15', 8), ('A', 16)]
    for liczba_str, baza in dane_wejsciowe:
        # Zamiana na system dziesiętny
        wartosc_dec = int(liczba_str, baza)
        
        # Sprawdzenie maksimum
        if wartosc_dec > max_wartosc:
            max_wartosc = wartosc_dec
            max_oryginal = f"{liczba_str} {baza}"
            
    return max_oryginal

dane = [("1011", 2), ("15", 8), ("A", 16)]
print("Największa liczba to:", znajdz_najwieksza(dane))
python

Zadbaj o typy danych!

Konwertując liczby binarne na dziesiętne, wartości mogą rosnąć bardzo szybko. W Pythonie typ int przyjmuje dowolnie duże wielkości, ale w C++ pamiętaj o użyciu long long, jeśli liczba binarna ma np. powyżej 30 bitów!

Najczęściej zadawane pytania (FAQ)

Najczęściej zadawane pytania (FAQ)

Czym różni się system octalny od binarnego?

System binarny operuje tylko na dwóch cyfrach (0 i 1) ze względu na architekturę sprzętową komputerów (prąd płynie / nie płynie). System octalny (system oct) używa podstawy 8 i cyfr 0-7. Pojawia się często jako łatwiejszy do zapisu format binarnego (grupowanie po 3 bity) np. przy ustalaniu uprawnień do plików.

Jak szybko zamienić system heksadecymalny na binarny?

Każda cyfra heksadecymalna odpowiada dokładnie 4 bitom w systemie binarnym. Wystarczy rozwinąć każdą z liter/cyfr na odpowiadającą jej 4-bitową reprezentację, np. 'A' to 10, czyli '1010'. 5 to '0101'. Zatem A5 w hex to bezpośrednio 10100101 w bin.

Czy konwersja systemów jest gwarantowana na maturze z informatyki?

Prawie! Często pojawia się w pierwszej części egzaminu (zadania testowe) lub jest ukryta w jednym z etapów większego zadania algorytmicznego. Opanowanie zamiany na system dziesiętny i odwrotnie to absolutny obowiązek.

Dlaczego podczas konwersji używamy modulo?

Operacja modulo (reszta z dzielenia) pozwala wydobyć najmniej znaczącą cyfrę danej liczby w docelowym systemie. Dzielenie z kolei 'przesuwa' liczbę, by w kolejnym kroku uzyskać dostęp do następnej cyfry. To fundament wyciągania cyfr z każdej liczby bazowej.

Masz wszystko, by na maturze zdobyć komplet punktów z systemów liczbowych. Poćwicz pisanie tych algorytmów z palca – kiedy zaczną dla Ciebie stanowić chleb powszedni, egzamin pójdzie gładko!

Szukasz więcej praktyki? Sprawdź pełny kurs do matury z informatyki.

Tagi:

matura
informatyka
systemy liczbowe
binarny
oct
heksadecymalny
algorytmy
python
c++
konwersja systemów

Udostępnij artykuł:

KI

O autorze: KursInformatyka

Zespół ekspertów specjalizujących się w przygotowaniu do matury z informatyki. Pomagamy uczniom osiągnąć wymarzony wynik na egzaminie.

Zobacz wszystkie artykuły

Bądź na bieżąco

Zapisz się do newslettera i otrzymuj najnowsze artykuły, porady i materiały prosto na swoją skrzynkę.

Twoje dane są bezpieczne. Możesz wypisać się w każdej chwili.