Systemy liczbowe: zamiana na system dwójkowy w Pythonie i C++
Na co dzień piszemy liczby w systemie dziesiętnym: cyfra na każdej pozycji ma wagę 10 razy większą od sąsiadki z prawej. 2026 to 2 * 1000 + 0 * 100 + 2 * 10 + 6. Komputer przechowuje liczby w systemie dwójkowym (binarnym), gdzie są tylko cyfry 0 i 1, a wagi to kolejne potęgi dwójki: 1, 2, 4, 8, 16 i tak dalej. Programiści często używają też systemu szesnastkowego, bo jest krótszy od dwójkowego i łatwo się na niego przelicza.
Na tej stronie znajdziesz dwa algorytmy, które obsługują każdą konwersję systemów liczbowych: dzielenie przez podstawę (z dziesiętnego na inny) i schemat Hornera (z innego na dziesiętny). Każdy przejdziesz krok po kroku w kursie Algorytmy z podstawy programowej: w przeglądarce, bez instalowania niczego i bez konta, z podglądem zmiennych w każdym kroku.
Przejdź zamianę na system dwójkowy krok po kroku
Idea: reszty z dzielenia to cyfry
Ostatnia cyfra liczby w systemie o podstawie p to reszta z dzielenia przez p. W dziesiętnym widać to od razu: 2026 % 10 = 6. Po podzieleniu całkowitym przez p (2026 // 10 = 202) ostatnia cyfra znika i możemy wyciągnąć następną. To samo działa dla podstawy 2: reszta z dzielenia przez 2 to ostatnia cyfra dwójkowa.
Algorytm zamiany liczby n na system o podstawie p:
- Dopóki n > 0: zapisz resztę n % p i zastąp n przez n // p.
- Zapisane reszty przeczytaj od ostatniej do pierwszej.
Zamiana na system dwójkowy w Pythonie
n = 13
wynik = ""
while n > 0:
reszta = n % 2
print(n, "// 2 =", n // 2, "reszta", reszta)
wynik = str(reszta) + wynik
n = n // 2
print("dwójkowo:", wynik) 13 // 2 = 6 reszta 1
6 // 2 = 3 reszta 0
3 // 2 = 1 reszta 1
1 // 2 = 0 reszta 1
dwójkowo: 1101 Dopisywanie reszty na początek napisu (str(reszta) + wynik) od razu odwraca kolejność, więc nie trzeba odwracać wyniku na końcu. Prześledźmy zmienne:
| n | n // 2 | n % 2 | wynik |
|---|---|---|---|
| 13 | 6 | 1 | 1 |
| 6 | 3 | 0 | 01 |
| 3 | 1 | 1 | 101 |
| 1 | 0 | 1 | 1101 |
Sprawdzenie: 1101 = 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1 = 13. Uwaga na zero: dla n = 0 pętla nie wykona się ani razu i wynik będzie pustym napisem, a powinien być “0”.
Zamiana dziesiętny na binarny w C++
W C++ zamiast napisu wygodnie zebrać reszty w tablicy int i wypisać ją od końca:
#include <iostream>
using namespace std;
int main() {
int n = 2026;
int cyfry[32];
int ile = 0;
while (n > 0) {
cyfry[ile] = n % 2;
n = n / 2;
ile++;
}
for (int i = ile - 1; i >= 0; i--) {
cout << cyfry[i];
}
cout << endl;
return 0;
} 11111101010 Liczba 2026 ma 11 cyfr dwójkowych, bo 2^10 = 1024 <= 2026 < 2048 = 2^11. Tablica na 32 cyfry wystarczy dla każdej dodatniej wartości typu int.
Ćwicz: zamień 2026 na system dwójkowy
Schemat Hornera: z dwójkowego na dziesiętny
W drugą stronę każda cyfra ma wagę będącą potęgą podstawy: 101101 = 1 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1 = 45. Zamiast liczyć potęgi, wygodniej użyć schematu Hornera: idziemy od lewej, mnożymy dotychczasowy wynik przez podstawę i dodajemy kolejną cyfrę. Każde mnożenie przez 2 “przesuwa” wcześniej dodane cyfry o jedną pozycję w lewo, więc na końcu każda ma właściwą wagę.
zapis = "101101"
wynik = 0
for znak in zapis:
wynik = wynik * 2 + int(znak)
print(znak, "->", wynik)
print("dziesiętnie:", wynik) 1 -> 1
0 -> 2
1 -> 5
1 -> 11
0 -> 22
1 -> 45
dziesiętnie: 45 | cyfra | obliczenie | wynik |
|---|---|---|
| 1 | 0 * 2 + 1 | 1 |
| 0 | 1 * 2 + 0 | 2 |
| 1 | 2 * 2 + 1 | 5 |
| 1 | 5 * 2 + 1 | 11 |
| 0 | 11 * 2 + 0 | 22 |
| 1 | 22 * 2 + 1 | 45 |
W C++ zapis dwójkowy trzymamy w tablicy znaków. Cyfrę jako liczbę dostajemy, odejmując kod znaku '0', a pętla kończy się na znaku końca napisu '\0':
#include <iostream>
using namespace std;
int main() {
char zapis[] = "101101";
int wynik = 0;
for (int i = 0; zapis[i] != '\0'; i++) {
wynik = wynik * 2 + (zapis[i] - '0');
}
cout << wynik << endl;
return 0;
} 45 Schemat Hornera nie służy tylko do systemów liczbowych: tak samo liczy się wartość wielomianu, a w Pythonie tak działa w środku int("101101", 2).
System ósemkowy, szesnastkowy i dowolna podstawa
Ten sam algorytm działa dla każdej podstawy od 2 do 16. Dla podstaw większych niż 10 reszty od 10 do 15 zapisujemy literami A-F, dlatego cyfrę bierzemy z napisu CYFRY po indeksie równym reszcie:
CYFRY = "0123456789ABCDEF"
def zamien(n, podstawa):
if n == 0:
return "0"
wynik = ""
while n > 0:
wynik = CYFRY[n % podstawa] + wynik
n //= podstawa
return wynik
print(zamien(2026, 2), bin(2026))
print(zamien(2026, 8), oct(2026))
print(zamien(2026, 16), hex(2026))
print(int("7EA", 16)) 11111101010 0b11111101010
3752 0o3752
7EA 0x7ea
2026 Gotowe funkcje Pythona dają ten sam wynik, tylko z przedrostkiem (0b, 0o, 0x) i małymi literami. Ta sama liczba w czterech systemach:
| dziesiętnie | dwójkowo | ósemkowo | szesnastkowo |
|---|---|---|---|
| 13 | 1101 | 15 | D |
| 45 | 101101 | 55 | 2D |
| 255 | 11111111 | 377 | FF |
| 2026 | 11111101010 | 3752 | 7EA |
Przy okazji widać skrót: jedna cyfra szesnastkowa to dokładnie cztery cyfry dwójkowe (2D = 0010 1101), a jedna ósemkowa to trzy (55 = 101 101). Dlatego programiści zapisują bajty szesnastkowo, np. kolory w CSS: #FF8000.
W C++ funkcja wypisuje cyfry od razu, więc zbieramy je w tablicy znaków:
#include <iostream>
using namespace std;
char CYFRY[] = "0123456789ABCDEF";
void wypisz(int n, int podstawa) {
char wynik[32];
int ile = 0;
if (n == 0) {
cout << 0 << endl;
return;
}
while (n > 0) {
wynik[ile] = CYFRY[n % podstawa];
n = n / podstawa;
ile++;
}
for (int i = ile - 1; i >= 0; i--) {
cout << wynik[i];
}
cout << endl;
}
int main() {
wypisz(255, 2);
wypisz(255, 8);
wypisz(255, 16);
wypisz(2026, 16);
return 0;
} 11111111
377
FF
7EA Lista kroków, pseudokod i schemat blokowy
Podstawa programowa wymaga, żeby uczeń opisywał problem specyfikacją (dane i wynik) i zapisywał algorytm listą kroków albo pseudokodem, a w szkole rysuje się też schematy blokowe. Pseudokod jest w stylu arkuszy maturalnych: ← to przypisanie, div i mod to iloraz i reszta z dzielenia całkowitego, a elementy tablic i znaki napisów są numerowane od 1 (w Pythonie od 0). Te same zapisy są w kursie przy lekcjach tematu, pod przyciskiem Algorytm.
Zamiana liczby dziesiętnej na dwójkową
Specyfikacja. Dane: liczba naturalna n ≥ 1. Wynik: zapis dwójkowy n (napis z cyfr 0 i 1).
Lista kroków:
- Wczytaj n. Ustaw w na pusty napis.
- Jeśli n = 0, przejdź do kroku 5.
- Dopisz resztę z dzielenia n przez 2 na początku napisu w.
- Zastąp n ilorazem całkowitym n przez 2 i wróć do kroku 2.
- Wypisz w i zakończ.
Pseudokod:
wczytaj n
w ← ""
dopóki n > 0 wykonuj
w ← napis(n mod 2) + w
n ← n div 2
wypisz w Schemat blokowy:
Zamiana dwójkowej na dziesiętną schematem Hornera
Specyfikacja. Dane: zapis dwójkowy s (napis z cyfr 0 i 1). Wynik: wartość dziesiętna liczby.
Lista kroków:
- Wczytaj zapis s. Ustaw w = 0.
- Dla kolejnych cyfr zapisu, od lewej do prawej: pomnóż w przez 2 i dodaj tę cyfrę.
- Wypisz w i zakończ.
Pseudokod:
wczytaj s
w ← 0
dla i = 1, 2, ..., długość(s) wykonuj
w ← w * 2 + kod(s[i]) - kod("0")
wypisz w Schemat blokowy:
Najczęstsze błędy
- Reszty w złej kolejności. Pierwsza reszta to ostatnia cyfra wyniku.
wynik = wynik + str(reszta)daje dla 13 napis 1011 zamiast 1101. - Zwykłe dzielenie zamiast całkowitego. W Pythonie
n / 2daje 6.5 i pętla kręci się na ułamkach. Potrzebne jestn // 2. W C++ dzielenie dwóchintjest całkowite samo z siebie. - Zero. Pętla
while n > 0dla n = 0 nic nie wypisze. Ten przypadek trzeba obsłużyć osobno. - Znak zamiast cyfry. W Pythonie
wynik * 2 + znakto błąd typu, trzebaint(znak). W C++'1'to kod 49, a nie 1, więc bez- '0'wynik wychodzi ogromny. - Cyfry większe niż 9. Przy podstawie 16 reszta 10 nie może zostać zapisana jako “10”, bo zmieniłaby długość zapisu. Stąd napis
CYFRYz literami A-F.
Ćwicz w przeglądarce
W temacie “Systemy liczbowe: dwójkowy, ósemkowy, szesnastkowy” kursu Algorytmy z podstawy programowej czekają trzy przykłady do krokowania i cztery zadania, które sprawdzają się automatycznie po uruchomieniu:
- zamień 2026 na system dwójkowy,
- zamień zapis dwójkowy na dziesiętny schematem Hornera,
- liczba 255 szesnastkowo i ósemkowo,
- ile jedynek ma zapis dwójkowy.
Przycisk Krok wykonuje jedną linię, a panel obok pokazuje aktualne wartości n, reszta i wynik, więc widać, jak zapis rośnie od prawej. W wersji z funkcją Krok wchodzi do jej środka, a stos wywołań pokazuje, skąd została wywołana. Ta sama pętla “reszta i dzielenie” liczy sumę cyfr liczby, a operacje na kodach znaków wracają w szyfrze Cezara. Pełna lista: algorytmy z podstawy programowej.
Dla nauczycieli
Zamiana systemów to dobra okazja, żeby pokazać, że ten sam algorytm działa dla każdej podstawy: uczniowie zaczynają od dwójkowego, a potem jedną zmianą stałej dostają ósemkowy i szesnastkowy. W BitWizards przydzielasz kurs klasie, udostępniasz tematy stopniowo i widzisz przebieg pisania kodu każdego ucznia (podgląd na żywo i odtwarzanie historii). Platforma jest darmowa dla szkół - jak zacząć. Więcej o tym, gdzie algorytmy leżą w podstawie programowej: informatyka w szkole.