Przejdź do treści

Aktualizacja: 4.11.2026

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:

  1. Dopóki n > 0: zapisz resztę n % p i zastąp n przez n // p.
  2. 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

Krokuj schemat Hornera

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:

  1. Wczytaj n. Ustaw w na pusty napis.
  2. Jeśli n = 0, przejdź do kroku 5.
  3. Dopisz resztę z dzielenia n przez 2 na początku napisu w.
  4. Zastąp n ilorazem całkowitym n przez 2 i wróć do kroku 2.
  5. 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:

Schemat blokowy: Zamiana liczby dziesiętnej na dwójkowąSchemat blokowy algorytmu: Zamiana liczby dziesiętnej na dwójkową. Te same kroki co w liście kroków i pseudokodzie.STARTwczytaj nw ← ""n > 0TAKw ← napis(n mod 2) + wn ← n div 2NIEwypisz wSTOP
Schemat blokowy: Zamiana liczby dziesiętnej na dwójkową

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:

  1. Wczytaj zapis s. Ustaw w = 0.
  2. Dla kolejnych cyfr zapisu, od lewej do prawej: pomnóż w przez 2 i dodaj tę cyfrę.
  3. 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:

Schemat blokowy: Zamiana dwójkowej na dziesiętną schematem HorneraSchemat blokowy algorytmu: Zamiana dwójkowej na dziesiętną schematem Hornera. Te same kroki co w liście kroków i pseudokodzie.STARTwczytaj sw ← 0i ← 1i ≤ długość(s)TAKw ← w * 2 + kod(s[i]) - kod("0")i ← i + 1NIEwypisz wSTOP
Schemat blokowy: Zamiana dwójkowej na dziesiętną schematem Hornera

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 / 2 daje 6.5 i pętla kręci się na ułamkach. Potrzebne jest n // 2. W C++ dzielenie dwóch int jest całkowite samo z siebie.
  • Zero. Pętla while n > 0 dla n = 0 nic nie wypisze. Ten przypadek trzeba obsłużyć osobno.
  • Znak zamiast cyfry. W Pythonie wynik * 2 + znak to błąd typu, trzeba int(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 CYFRY z 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:

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.

Lekcje do wypróbowania bez logowania

Algorytmy z podstawy programowej

Podstawy C++

Częste pytania

Jak zamienić liczbę dziesiętną na system dwójkowy?

Dzielimy liczbę przez 2 i zapisujemy resztę (0 albo 1), potem dzielimy wynik dzielenia, i tak aż do zera. Reszty czytane od ostatniej do pierwszej tworzą zapis dwójkowy. Dla 13 reszty to 1, 0, 1, 1, więc 13 = 1101 w systemie dwójkowym.

Na czym polega schemat Hornera przy zamianie na system dziesiętny?

Idziemy po cyfrach od lewej. Wynik zaczyna się od 0, a przy każdej cyfrze mnożymy go przez podstawę i dodajemy tę cyfrę. Dla 1101: 0*2+1 = 1, 1*2+1 = 3, 3*2+0 = 6, 6*2+1 = 13. Nie trzeba liczyć potęg dwójki.

Skąd litery A-F w systemie szesnastkowym?

System szesnastkowy potrzebuje 16 cyfr, a cyfr arabskich jest tylko 10. Wartości od 10 do 15 zapisuje się więc literami A, B, C, D, E, F. Na przykład 255 = FF, bo 15 * 16 + 15 = 255. Jedna cyfra szesnastkowa odpowiada dokładnie czterem cyfrom dwójkowym.

Czy Python ma gotowe funkcje do zamiany systemów?

Tak: bin(n), oct(n) i hex(n) zamieniają liczbę na napis z przedrostkiem 0b, 0o albo 0x, a int(napis, podstawa) zamienia w drugą stronę, np. int('7EA', 16) daje 2026. W zadaniach szkolnych i maturalnych często trzeba jednak napisać algorytm samodzielnie.

Czy zamiana systemów liczbowych jest w podstawie programowej?

Tak. Zamiana liczb między systemami pozycyjnymi jest wymieniona w podstawie programowej informatyki dla liceum i technikum w zakresie podstawowym i pojawia się w zadaniach maturalnych.

Zacznij już teraz

BitWizards jest darmowy. Wypróbuj demo bez logowania albo zaloguj się do aplikacji, żeby zapisywać postęp na koncie.

Zobacz, jak zacząć