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
| System | Podstawa | Dostępne cyfry | Zastosowanie |
|---|---|---|---|
| Dziesiętny (Dec) | 10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 | Codzienne życie człowieka |
| Binarny (Bin) | 2 | 0, 1 | Podstawa działania komputerów (bity) |
| Ósemkowy (Oct) | 8 | 0, 1, 2, 3, 4, 5, 6, 7 | Uprawnienia w systemach Linux (chmod) |
| Szesnastkowy (Hex) | 16 | 0-9 oraz A, B, C, D, E, F | Adresy 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
- 45 / 2 = 22, reszta 1
- 22 / 2 = 11, reszta 0
- 11 / 2 = 5, reszta 1
- 5 / 2 = 2, reszta 1
- 2 / 2 = 1, reszta 0
- 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'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'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;
}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;
}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))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.