- 27 maja 2025
- Posted by: Damian
- Category: Baza wiedzy

Znajomość systemów liczbowych jest istotna nie tylko przy programowaniu, ale też na maturze z informatyki. Część zadań w arkuszach maturalnych często związana jest z systemem binarnym. Warto więc poznać sposoby konwersji pomiędzy systemami liczbowymi, zarówno w ramach obliczeń „na kartce”, jak i przy gotowych funkcjach oferowanych przez poszczególne języki programowania.
Kalkulator systemów liczbowych – binarny, ósemkowy, heksadecymalny
Przeliczy liczbę (maksymalnie 20 cyfr) automatycznie na systemy: dwójkowy, ósemkowy, dziesiętny i szesnastkowy.
Wynik konwersji.
Co to systemy liczbowe?
Systemy liczbowe to sposób reprezentowania liczb przy użyciu różnych zestawów symboli oraz ich kombinacji. W przypadku każdego systemu można znaleźć unikalny sposób reprezentacji liczb. W tym artykule omówione są systemy liczbowe pozycyjne, czyli takie, w których wartość danej liczby zależy od tego, na jakich pozycjach znajdują się konkretne cyfry (przykładowo: w systemie dziesiętnym inną wartość ma 12, a inną 21). Przeciwieństwem są systemy niepozycyjne (addytywne), gdzie wartość liczby zależy od sumy wartości symboli.
Teoretycznie istnieje nieskończona liczba pozycyjnych systemów liczbowych (wystarczy użyć innej wartości jako podstawy), ale najpopularniejsze okazują się dwójkowy (binarny), ósemkowy (oktalny), dziesiętny (decymalny) oraz szesnastkowy (heksadecymalny). Zapewne zastanawiasz się, do czego właściwie one służą. Tymczasem dla każdego z nich można znaleźć inne zastosowania:
- Dziesiętny (decymalny, DEC) – system liczbowy używany powszechnie na co dzień ze względu na intuicyjny sposób stosowania. Opiera się na podstawie 10, a więc używa dziesięciu cyfr – od 0 do 9. Każdą wartość można zapisać poprzez mnożenie cyfr przez kolejne potęgi podstawy (czyli liczby 10) i sumując je ze sobą, np.: 37 = 3 * 101+ 7 * 100 = 30 + 7 = 37.
- Dwójkowy (binarny, BIN) – system liczbowy używany w elektronice oraz w informatyce, gdzie jednostką informacji jest bit. Został wybrany do komputerów ze względu na dobre dopasowanie względem działania elektroniki, gdzie 1 to sygnał, a 0 to brak sygnału (elektrycznego).
- Ósemkowy (oktalny, OCT) – system liczbowy oparty na podstawie 8. Używa cyfr od 0 do 7. Stosowany jest do przypisywania uprawnień w systemach Linux, a także w językach programowania takich jak C, C++ czy Java.
- Szesnastkowy (heksadecymalny, HEX) – system liczbowy oparty na podstawie 16. Oprócz cyfr od 0 do 9 używa także liter od A do F (lub a do f) jako reprezentacji liczb większych niż 9. Jest szeroko stosowany w informatyce, ponieważ można go łatwo przekonwertować na system binarny, a także zapisać większe liczby w mniejszej liczbie znaków. Można go znaleźć np. w adresach MAC czy IPv6, wykorzystywany jest też do zapisu kolorów.
Oczywiście możliwe jest zastosowanie konwersji danych liczb pomiędzy różnymi systemami zapisywania liczb. W tym celu stosuje się dwie metody: tabeli oraz reszty z dzielenia, a także wbudowane narzędzia i funkcje.

Liczby w konkretnym systemie liczbowym oznacza się poprzez ustawienie podstawy danego systemu jako indeksu dolnego wartości, przykładowo:
- 3710 – dziesiętny,
- 102 – dwójkowy
- 78 – ósemkowy,
- A16 – szesnastkowy.
Binarny, ósemkowy lub heksadecymalny na dziesiętny – Przeliczanie systemów liczbowych
Do przeliczania systemów liczbowych na dziesiętny tradycyjnie korzysta się z dwóch metod, których można śmiało użyć na kartce papieru.
Przeliczenie jakiegokolwiek systemu liczbowego na dziesiętny okazuje się niezwykle proste. Wystarczy zsumować ze sobą wyniki mnożenia cyfr przez podstawę systemu do potęgi (pozycja cyfry) dla każdej kolejnej cyfry. Poniżej znajdziesz przykład konwersji liczby binarnej 10011 na system dziesiętny.
Stosuje się ogólny wzór:
cyfra * podstawa systemupozycja cyfry + kolejna cyfra * podstawa systemupozycja cyfry + … + ostatnia cyfra * podstawa systemupozycja cyfry
Co w przypadku konwersji liczby 100112 prezentuje się następująco:
1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 1 * 20
Jak widać, należy brać każdą z cyfr po kolei (od lewej) i mnożyć przez podstawę systemu liczenia do potęgi o wartości pozycji cyfry (gdzie numer 0 to cyfra znajdująca się najdalej po prawej). Skoro więc w liczbie binarnej 100112 pierwsza liczba od lewej to 1, mnoży się ją przez liczbę 2 (podstawa systemu) do potęgi 4 (pozycja cyfry licząc od prawej), a więc 1 * 24. Następnie dodaje się kolejne cyfry mnożone przez potęgę podstawy systemu.
1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 1 * 20 = 16 + 0 + 0 + 2 + 1 = 19
Liczba binarna 100112 odpowiada więc liczbie 19 w systemie dziesiętnym.
Przykłady konwersji liczb na system dziesiętny (decymalny):
- Liczba dwójkowa (binarna) – 10102: 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 8 + 0 + 2 + 0 = 10
- Liczba ósemkowa (oktalna) – 648: 6 * 81 + 4 * 80 = 48 + 4 = 52
- Liczba szesnastkowa (heksadecymalna) – AC16: A * 161 + C * 160 = 10 * 161 + 12 * 160 = 160 + 12 = 172
Istnieje również zastosowanie powyższej metody w formie tabeli, co może okazać się bardziej intuicyjne dla użytkownika.
Poniższa tabela składa się z potęg podstawy systemu, ich wartości, a także samych zer w trzecim wierszu.
210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
W liczbie binarnej (lub innej) należy zapisać konkretne cyfry z liczby do powyższej tabeli, od prawej do lewej strony. Przykładowo cyfra 1 najbardziej na prawo z liczby 10110001 jest wstawiana do komórki najbardziej na prawo (20), co widać na poniższym przykładzie.
Przykład konwersji z systemu dwójkowego
210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
Liczba binarna – 101100012
Teraz wystarczy pomnożyć liczby z drugiego wiersza przez wartości z trzeciego wiersza i dodać je do siebie: 128 * 1 + 32 * 1 + 16 * 1 + 1 * 1 = 128 + 32 + 16 + 1 = 177
W ten sposób można łatwo obliczyć wartość liczby z systemu zero-jedynkowego.
Przykład konwersji z systemu ósemkowego
84 | 83 | 82 | 81 | 80 |
4096 | 512 | 64 | 8 | 1 |
0 | 0 | 0 | 0 | 0 |
Liczba ósemkowa – 2618
84 | 83 | 82 | 81 | 80 |
4096 | 512 | 64 | 8 | 1 |
0 | 0 | 2 | 6 | 1 |
64 * 2 + 8 * 6 + 1 * 1 = 128 + 48 + 1 = 177
Przykład konwersji z systemu szesnastkowego
163 | 162 | 161 | 160 |
4096 | 256 | 16 | 1 |
0 | 0 | 0 | 0 |
Liczba szesnastkowa – B116
163 | 162 | 161 | 160 |
4096 | 256 | 16 | 1 |
0 | 0 | B (czyli 11) | 1 |
16 * 11 + 1 * 1 = 176 + 1 = 177
Dziesiętny na binarny, ósemkowy lub heksadecymalny- Przeliczanie systemów liczbowych
Poniżej zostaną przedstawione dwie metody służące do konwersji liczb z systemu dziesiętnego na inny dowolny system liczbowy.
210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
W tym przypadku korzysta się z gotowej tabeli potęgowania, podobnej do tej przedstawionej wyżej, dzięki której naprawdę łatwo uda się zmienić liczbę decymalną na binarną. Liczba, którą zmieniamy, to 177.
W tabeli potęgowania należy znaleźć największą wartość, zawartą w liczbie 177, czyli w tym przypadku 128. Sprawdzamy, ile razy się tam znajduje (w tym przypadku jeden raz), co zapisujemy w kolejnej tabeli (wyniku).
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Następnie odejmujemy 177 – 128 = 49.
Teraz robimy to samo co wcześniej, tyle że z liczbą 49. A więc największa liczba w tym przypadku to 32, która również pojawia się tylko raz.
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
49 – 32 = 17
Powtarzamy nasze czynności z liczbą 17.
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
17 – 16 = 1
Teraz to 1.
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
Z drugiego wiersza tabeli odczytujemy liczbę po konwersji. Zer z lewej strony nie trzeba zapisywać.
Liczba po konwersji wynosi zatem: 10110001.
17710 = 101100012
Przykład konwersji na liczbę ósemkową (oktalną)
Tutaj również zmieniamy 17710, jednak na system oktalny.
84 | 83 | 82 | 81 | 80 |
4096 | 512 | 64 | 8 | 1 |
Szukana wielokrotność to 64, która w przeliczanej wartości znajduje się 2 razy.
4096 | 512 | 64 | 8 | 1 |
0 | 0 | 2 | 0 | 0 |
177 – (64 * 2) = 177 – 128 = 49
Poszukiwana wartość to 8, która w liczbie 49 znajduje się 6 razy.
4096 | 512 | 64 | 8 | 1 |
0 | 0 | 2 | 6 | 0 |
49 – (8 * 6) = 49 – 48 = 1
Z kolei teraz znajdujemy liczbę 1.
4096 | 512 | 64 | 8 | 1 |
0 | 0 | 2 | 6 | 1 |
17710 = 2618
Liczba po konwersji na system ósemkowy to w takim razie 2618.
Przykład konwersji na liczbę szesnastkową (heksadecymalną)
163 | 162 | 161 | 160 |
4096 | 256 | 16 | 1 |
Konwertowana liczba: 17710.
Największa liczba w 177 to 16, która znajduje się tam 11 razy. Należy jednak pamiętać, że liczby od 10 do 15 to litery od A do F (w systemie szesnastkowym). Dlatego 11 jest zapisywane jako B.
4096 | 256 | 16 | 1 |
0 | 0 | B | 0 |
177 – (16 * 11) = 177 – 176 = 1
Teraz to oczywiście liczba 1.
4096 | 256 | 16 | 1 |
0 | 0 | B | 1 |
17710 = B116
Liczba po konwersji na system szesnastkowy to w takim razie B116.
Kolejna metoda konwersji liczb z systemu decymalnego na inny (pozycyjny) jest równie prosta. Może okazać się nawet bardziej intuicyjna przy ręcznym rozpisywaniu na kartce. W tym przypadku chodzi o dzielenie danej liczby przez podstawę systemu docelowego, a liczbę po konwersji tworzymy poprzez łączenie ze sobą reszt z dzielenia.
Przykład konwersji na liczbę dwójkową (binarną)

Podobnie jak w poprzednich przykładach, zastosujemy tu konwersję liczby 177.
177 : 2 = 88 (reszta z dzielenia: 1)
88 : 2 = 44 (reszta z dzielenia: 0)
44 : 2 = 22 (reszta z dzielenia: 0)
22 : 2 = 11 (reszta z dzielenia: 0)
11 : 2 = 5 (reszta z dzielenia: 1)
5 : 2 = 2 (reszta z dzielenia: 1)
2 : 2 = 1 (reszta z dzielenia: 0)
1 : 2 = 0 (reszta z dzielenia: 1)
Teraz należy odczytać reszty z dzielenia od dołu do góry, co w rezultacie tworzy 101100012.
Przykład konwersji na liczbę ósemkową (oktalną)
177 : 8 = 22 (reszta z dzielenia: 1)
22 : 8 = 2 (reszta z dzielenia: 6)
2 : 8 = 0 (reszta z dzielenia: 2)
Teraz po odczytaniu reszty z dzielenia od dołu do góry mamy wynik 2618.
Przykład konwersji na liczbę szesnastkową (heksadecymalną)
177 : 16 = 11 (reszta z dzielenia: 1)
11 : 16 = 0 (reszta z dzielenia: 11)
Po odczytaniu reszty z dzielenia od dołu do góry liczbą szesnastkową okazuje się B116. Należy przy tym pamiętać, że w przypadku systemu szesnastkowego liczby od 10 do 15 zmieniają się na litery od A do F.
Uwaga: Warto pamiętać, że w przypadku języków programowania często stosuje się znak % jako operator modulo, a więc taki, który zwraca w formie liczby całkowitej resztę z dzielenia. Z kolei w przypadku pseudokodu stosuje się operator mod, który działa w ten sam sposób. Prezentuje się to następująco: 12 % 7 = 5, 12 mod 7 = 5, bo reszta z dzielenia to właśnie 5. Możliwe jest pobranie konkretnej cyfry z liczby poprzez zastosowanie reszty z dzielenia. Przykładowo 127 mod 10 = 7, a przy tym 127 div 10 = 12, co można dalej dzielić i uzyskiwać konkretne liczby według własnych potrzeb.
Binarny na szesnastkowy i ósemkowy – Przeliczanie systemów liczbowych
W przypadku przeliczania liczb pomiędzy systemami liczbowymi, np. z binarnego na heksadecymalny, najbardziej intuicyjnym rozwiązaniem jest przeliczenie liczby na system dziesiętny, a następnie z dziesiętnego na docelowy.
Jednak konwersja między systemami, gdzie podstawa systemu to potęga liczby 2, również okazuje się prosta do wykonania. Wystarczy skorzystać z tabeli konwersji, która została już wcześniej zaprezentowana (w formie graficznej).
W przypadku zmiany systemu z binarnego na szesnastkowy wystarczy podzielić liczbę dwójkową na czwórki bitów, gdzie każdą z nich przekształca się na liczbę szesnastkową. Stosuje się tu czwórki bitów, bo liczba 2 spotęgowana do 4 równa się 16.
Warto zauważyć, że jeśli cztery bity mają po lewej stronie zera, można je usunąć, co pomoże znaleźć odpowiednią liczbę w tabeli konwersji. Czyli przykładowo 0001 to w tabeli konwersji liczba binarna 1. Możesz też samodzielnie przeliczyć każdą czwórkę na system dziesiętny, a następnie na szesnastkowy. Należy przy tym pamiętać, że bity tworzy się od prawej strony, co widać na poniższym przykładzie.
Jeśli liczba cyfr w wartości binarnej nie jest podzielna przez cztery, wystarczy dodać odpowiednią liczbę zer z lewej strony.
Przykłady konwersji liczb binarnych na szesnastkowe
101100012 = 1011 00012
10112 = B16
00012 = 116
1011 00012 = B116
1001012 = 0010 01012
00102 = 216
01012 = 516
0010 01012 = 2516
Przykłady konwersji liczb binarnych na ósemkowe
Praktycznie tak samo jak konwersja liczb dwójkowych na szesnastkowych, działa konwersja na ósemkowe, jednak dzieli się wartość binarną na części po 3 bity. Oczywiście w sytuacji, gdy nie ma odpowiedniej liczby cyfr, dodaje się zera z lewej strony.
110012 = 011 0012
0112 = 38
0012 = 18
011 0012 = 318
1101012 = 110 1012
1102 = 68
1012 = 58
110 1012 = 658
Zadania – Przeliczanie systemów liczbowych
1. Zmień poniższe liczby na system dziesiętny za pomocą jednej z wcześniej omówionych metod. Po kliknięciu w zaciemnioną linię pojawi się odpowiedź do danej konwersji.
111002
2810
E816
23210
1318
8910
2. Zmień poniższe liczby z systemu dziesiętnego kolejno na dwójkowy, ósemkowy i szesnastkowy.
35610
1011001002
12710
1778
17310
AD16
Algorytm przeliczania systemów liczbowych – pseudokod, schemat blokowy oraz implementacje
W niektórych zadaniach maturalnych ściśle określono, z jakich typów zmiennych i funkcji można korzystać (najczęściej bez możliwości konwersji na kod ASCII). Dlatego poniżej znajdziesz wersję z wykorzystaniem oraz bez wykorzystania tego typu funkcji. Jeśli nie potrzebujesz konwersji do systemu szesnastkowego (heksadecymalnego), wystarczy Ci wersja bez użycia tablicy ASCII.
W zadaniach maturalnych może pojawić się ograniczenie typu: „Twój algorytm może używać wyłącznie zmiennych przechowujących liczby całkowite oraz może operować wyłącznie na liczbach całkowitych”.
Konwersja systemów liczbowych (binarnego, oktalnego i decymalnego) – bez użycia tablicy ASCII
Poniżej znajdziesz implementację algorytmu przeliczania na systemy liczbowe przy użyciu tylko wartości liczbowych. Ten kod działa dla systemów binarnego, oktalnego i decymalnego, a więc tych, które korzystają z samych cyfr.
1 2 3 4 5 6 7 8 9 | funkcja KonwersjaSystemu(liczba, bazaZ, bazaD): wynik ← 0 pozycja ← 1 dopóki liczba > 0 wykonuj: reszta ← liczba mod bazaD wynik ← wynik + reszta * pozycja liczba ← liczba div bazaD pozycja ← pozycja * bazaZ zwróć wynik |
Opis konwersji między systemami liczbowymi – pseudokod
- 1 linia – definicja funkcji KonwersjaSystemu, która przyjmuje trzy argumenty: liczba (liczba do konwersji), bazaZ (baza liczby źródłowej) i bazaD (baza liczby docelowej),
- 2 linia – inicjalizacja zmiennej wynik jako zero. Ta zmienna będzie przechowywać wynik konwersji liczby,
- 3 linia – inicjalizacja zmiennej pozycja jako jeden. Ta zmienna będzie używana do przechowywania wartości pozycji cyfry w docelowym systemie liczbowym,
- 4 linia – rozpoczyna pętlę, która będzie kontynuowana, dopóki wartość liczby jest większa od zera,
- 5 linia – obliczenie reszty z dzielenia liczby przez bazę docelową. Ta reszta będzie kolejną cyfrą w docelowym systemie liczbowym,
- 6 linia – dodanie obliczonej reszty pomnożonej przez wartość pozycji do zmiennej wynik. W ten sposób aktualizujemy wynik konwersji,
- 7 linia – dzielenie całkowite liczby przez bazę docelową, aby uzyskać kolejną cyfrę do konwersji,
- 8 linia – pomnożenie wartości pozycji przez bazę źródłową, aby zmienić jej wartość na wartość pozycji kolejnej cyfry w docelowym systemie liczbowym,
- 9 linia – zwrócenie wyniku końcowego konwersji po zakończeniu pętli.
W tym przypadku mnoży się daną cyfrę z pozycją (1, 10, 100 itd.), dzięki czemu można wstawić cyfrę na konkretną pozycję w ramach danej liczby. Zmienna obsługuje liczbę całkowitą w systemie dziesiętnym, więc ta metoda to proste obejście tego ograniczenia. Czyli przykładowo, gdy posiada się cyfry 4, 7, 6, które należy połączyć ze sobą w tej kolejności, pierwszą z nich mnoży się przez 100, drugą przez 10, a trzecią przez 1 w ramach pętli, po czym dodaje się do siebie. Pozwoli to uzyskać liczbę 476.
Python – implementacja algorytmu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def konwersja_systemu(liczba, bazaZ, bazaD): wynik = 0 pozycja = 1 while liczba > 0: reszta = liczba % bazaD wynik = wynik + reszta * pozycja liczba = liczba // bazaD pozycja = pozycja * bazaZ return wynik liczba = int(input("Podaj liczbe: ")) bazaZ = int(input("Podaj baze zrodlowa: ")) bazaD = int(input("Podaj baze docelowa: ")) wynik = konwersja_systemu(liczba, bazaZ, bazaD) print("Wynik:", wynik) |
C++ – implementacja algorytmu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> using namespace std; int KonwersjaSystemu(int liczba, int bazaZ, int bazaD) { int wynik = 0; int pozycja = 1; while (liczba > 0) { int reszta = liczba % bazaD; wynik = wynik + reszta * pozycja; liczba = liczba / bazaD; pozycja = pozycja * bazaZ; } return wynik; } int main() { int liczba, bazaZ, bazaD; cout << "Podaj liczbe: "; cin >> liczba; cout << "Podaj baze zrodlowa: "; cin >> bazaZ; cout << "Podaj baze docelowa: "; cin >> bazaD; int wynik = KonwersjaSystemu(liczba, bazaZ, bazaD); cout << "Wynik: " << wynik << endl; return 0; } |
Java – implementacja algorytmu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public class Main { public static int konwersja(int liczba, int bazaZ, int bazaD) { int wynik = 0; int pozycja = 1; while (liczba > 0) { int reszta = liczba % bazaD; wynik = wynik + reszta * pozycja; liczba = liczba / bazaD; pozycja = pozycja * bazaZ; } return wynik; } public static void main(String[] args) { int liczba, bazaZ, bazaD; java.util.Scanner scanner = new java.util.Scanner(System.in); System.out.print("Podaj liczbe: "); liczba = scanner.nextInt(); System.out.print("Podaj baze zrodlowa: "); bazaZ = scanner.nextInt(); System.out.print("Podaj baze docelowa: "); bazaD = scanner.nextInt(); int wynik = konwersja(liczba, bazaZ, bazaD); System.out.println("Wynik: " + wynik); scanner.close(); } } |
Konwersja na inne systemy liczbowe (binarny, oktalny, decymalny i heksadecymalny) – z użyciem tablicy ASCII
Poniżej znajdziesz implementację wcześniej przedstawionych sposobów na konwersję systemów liczbowych (metody: wzoru oraz reszty z dzielenia). Litery do systemu szesnastkowego pobiera się z tablicy znaków ASCII. Funkcja KodASCII zmienia znak na kod, z kolei funkcja ZnakASCII zmienia kod na znak.
1 2 3 4 5 6 7 8 9 10 11 | Funkcja ZmianaNaInnySystem (liczba, baza): wynik ← "" dopóki liczba > 0 wykonuj reszta ← liczba mod baza liczba ← liczba div baza jeżeli reszta < 10 wykonuj znak ← KodASCII ("0") + reszta w przeciwnym razie znak ← KodASCII ("A") + reszta - 10 wynik ← ZnakASCII (znak) + wynik zwróć wynik |
Opis konwersji na inne systemy liczbowe – pseudokod
- 1 linia – definiowana jest funkcja ZmianaNaInnySystem, która przyjmuje dwa argumenty: liczba (liczba, którą chcemy przekonwertować) i baza (system liczbowy, do którego chcemy przekonwertować wartość),
- 2 linia – inicjalizowana jest zmienna wynik jako pusty ciąg znaków, w którym będziemy budować wynikową liczbę w nowym systemie liczbowym,
- 3 linia – początek pętli dopóki (odpowiednik while), która będzie działać dopóty, dopóki liczba będzie większa od zera,
- 4 linia – w każdej iteracji obliczana jest reszta z dzielenia liczba przez baza i przypisywana do zmiennej reszta, co jest kluczowe we wcześniej opisanej metodzie wykorzystującej resztę z dzielenia (modulo),
- 5 linia – następnie wartość liczba jest aktualizowana przez podzielenie jej przez zmienną baza (używa się tu dzielenia całkowitego div, bo reszta z dzielenia jest tu niepotrzebna),
- 6 linia – sprawdza, czy wartość zmiennej reszta jest mniejsza niż 10, żeby zorientować się jakie kody ASCII mają być wykorzystane,
- 7 linia – jeśli reszta jest mniejsza niż 10, dodaje wartość ASCII znaku 0, KodASCII (“0”) (czyli 48) do reszta i przypisuje wynik do zmiennej znak. Kod ASCII dla cyfry 0 to 48, dla cyfry 1 to 49, itd, aż do cyfry 9, która ma kod 57. Dodając kod ASCII cyfry 0 do reszta, uzyskujemy odpowiedni kod ASCII dla cyfr od 0 do 9,
- 8 linia – zmienna reszta posiada wartość co najmniej 10 i odpowiada literom od “A” wzwyż w systemach o podstawie większej niż 10 (np. system szesnastkowy, gdzie 10 odpowiada “A”, 11 odpowiada “B”, itd), przez co wykonywana jest instrukcja z kolejnej linii,
- 9 linia – dodaje wartość kodu ASCII litery A KodASCII (“A”) (czyli 65) do zmiennej reszta i przypisuje wynik do zmiennej znak. Litera “A” w ASCII ma kod 65, co oznacza, że dla zmiennej reszta równej 10, znak powinien wynosić 65 ze względu na odjęcie od reszty wartości 10. Dlatego 65 + 10 – 10 daje 66.
- 10 linia – do zmiennej wynik dodawany jest znak odpowiadający danej reszcie w systemie liczbowym, a dokładniej znak z tablicy ASCII na pozycji reszta + 48 lub + 55,
- 11 linia – po przejściu pętli dopóki (while) zwracana jest zmienna wynik, która zawiera przekonwertowaną liczbę w nowym systemie liczbowym.
Python – implementacja konwersji na inny system liczbowy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def ZmianaNaInnySystem(liczba, baza): wynik = "" while liczba > 0: reszta = liczba % baza liczba = liczba // baza if reszta < 10: znak = ord("0") + reszta else: znak = ord("A") + reszta - 10 wynik = chr(znak) + wynik return wynik decL = 243 baza = 16 wynik = ZmianaNaInnySystem(decL, baza) print(wynik) #wynik to F3 |
C++ – implementacja konwersji na inny system liczbowy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <string> using namespace std; string zmianaNaInnySystem(int liczba, int baza) { string wynik = ""; while (liczba > 0) { int reszta = liczba % baza; liczba = liczba / baza; char znak; if (reszta < 10) { znak = int('0') + reszta; } else { znak = int('A') + reszta - 10; } wynik = znak + wynik; } return wynik; } int main() { int decL = 243; int baza = 16; string wynik = zmianaNaInnySystem(decL, baza); cout << wynik; // wynik to F3 return 0; } |
Java – implementacja konwersji na inny system liczbowy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Main { public static String zmianaNaInnySystem(int liczba, int baza) { String wynik = ""; while (liczba > 0) { int reszta = liczba % baza; liczba = liczba / baza; char znak; char zero = '0'; char znakA = 'A'; if (reszta < 10) { znak = (char) ((int) (zero) + reszta); } else { znak = (char) ((int) (znakA) + reszta - 10); } wynik = znak + wynik; } return wynik; } public static void main(String[] args) { int decL = 243; int baza = 16; String wynik = zmianaNaInnySystem(decL, baza); System.out.println(wynik); // wynik to F3 } } |
Konwersja na system dziesiętny – z użyciem tablicy ASCII
1 2 3 4 5 6 7 8 9 10 11 12 | Funkcja ZmianaNaDziesietny (liczba, baza): wynik ← 0 mnoznik ← 1 dla i = dlugosc (liczba) … 1 wykonuj: WartoscASCII ← liczba [i] jeżeli WartoscASCII >= KodASCII (0) i WartoscASCII <= KodASCII (9) wykonuj o ← WartoscASCII - KodASCII (0) w przeciwnym razie o ← WartoscASCII - 55 wynik ← wynik + o * mnoznik mnoznik ← mnoznik * baza zwróć wynik |
Opis konwersji na system dziesiętny – pseudokod
- 1 linia – definicja funkcji ZmianaNaDziesietny z dwoma argumentami: liczba (wartość liczby w innym systemie w formie zmiennej napisowej string), baza (system liczbowy),
- 2 linia – inicjalizacja zmiennej wynik jako 0. Będzie przechowywać wartość przeliczoną na system dziesiętny,
- 3 linia – inicjalizacja zmiennej mnoznik jako 1. Pozwoli na umieszczenie cyfr na odpowiednich pozycjach w liczbie. Przykładowo 5 * 1 = 5, a 5 * 10 = 50, jak widać w systemie decymalnym można dowolnie umieszczać liczby na odpowiednich pozycjach za pomocą mnożenia przez 1, 10, 100 itd,
- 4 linia – rozpoczynamy pętlę dla (odpowiednik for) przechodzącą od długości napisu liczba (wskazany za pomocą funkcji dlugosc) do 1 włącznie, która będzie służyć do iterowania po poszczególnych cyfrach w zmiennej liczba,
- 5 linia – pobiera wartość ASCII dla znaku liczba [i] (czyli znaku z napisu liczba, o pozycji i).
- 6 linia – sprawdza, czy WartoscASCII jest w zakresie kodów ASCII dla cyfr 0-9 (48-57).
- 7 linia – jeśli WartoscASCII jest kodem cyfry (48-57), oblicza jej wartość numeryczną jako WartoscASCII – 48. Przykładowo dla znaku 1 (ASCII 49), wartość będzie 1, bo 49 – 48 = 1.
- 8 linia – jeśli WartoscASCII nie jest cyfrą, algorytm uznaje, że jest w zakresie kodów ASCII dla liter “A”-”Z” (65-90).
- 9 linia – jeśli WartoscASCII jest kodem litery, oblicza jej wartość numeryczną jako WartoscASCII – 55. Przykładowo dla znaku “B” (ASCII 66), wartość będzie 11 bo 66 – 55 = 11.
- 10 linia – Dodaje do zmiennej wynik wartość o pomnożoną przez aktualny mnoznik. To przekształca znak na odpowiednią wartość numeryczną i dodaje ją do wyniku uwzględniając wagę pozycji. Przykładowo wynik = 0 + 5 * 1 = 5.
- 11 linia – aktualizuje zmienną mnoznik, mnożąc go przez baza. Powoduje to przesunięcie wagi pozycji na wyższą w systemie liczbowym (np. z 1 na 10 w systemie dziesiętnym),
- 12 linia – po zakończeniu pętli zwracamy ostateczną wartość wynik, która jest wynikiem przekształcenia liczby na system dziesiętny.
Python – implementacja konwersji na system dziesiętny
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def ZmianaNaDziesietny(liczba, baza): wynik = 0 mnoznik = 1 for i in range(len(liczba) - 1, -1, -1): WartoscASCII = ord(liczba[i]) if ord("0") <= WartoscASCII <= ord("9"): o = WartoscASCII - ord("0") else: o = WartoscASCII - 55 wynik += o * mnoznik mnoznik *= baza return wynik liczba = "F3" baza = 16 wynik = ZmianaNaDziesietny(liczba, baza) print(wynik) # wynik to 243 |
C++ – implementacja konwersji na system dziesiętny
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <string> using namespace std; int zmianaNaDziesietny(string liczba, int baza) { int wynik = 0; int mnoznik = 1; for (int i = liczba.length() - 1; i >= 0; --i) { int WartoscASCII = static_cast<int>(liczba[i]); int o; if (int('0') <= WartoscASCII && WartoscASCII <= int('9')) { o = WartoscASCII - int('0'); } else { o = WartoscASCII - 55; } wynik += o * mnoznik; mnoznik *= baza; } return wynik; } int main() { string liczba = "F3"; int baza = 16; int wynik = zmianaNaDziesietny(liczba, baza); cout << wynik; // wynik to 243 return 0; } |
Java – implementacja konwersji na system dziesiętny
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Main { public static int zmianaNaDziesietny(String liczba, int baza) { int wynik = 0; int mnoznik = 1; for (int i = liczba.length() - 1; i >= 0; --i) { int WartoscASCII = (int) liczba.charAt(i); int o; char zero = '0'; char dziewiec = '9'; if ((int) (zero) <= WartoscASCII && WartoscASCII <= (int) (dziewiec)) { o = WartoscASCII - (int) (zero); } else { o = WartoscASCII - 55; } wynik += o * mnoznik; mnoznik *= baza; } return wynik; } public static void main(String[] args) { String liczba = "F3"; int baza = 16; int wynik = zmianaNaDziesietny(liczba, baza); System.out.println(wynik); // wynik to 243 } } |
Przeliczanie systemów liczbowych – gotowe funkcje programów Python, C++ i Java
Konkretne języki programowania mają wbudowane funkcje, z których możesz skorzystać w celu konwersji na inne systemy liczbowe. Poniżej znajdziesz ich opis oraz przykłady zastosowania.
Python – wbudowane funkcje
System dziesiętny na inny system liczbowy
Istnieje kilka wbudowanych funkcji, z których można skorzystać w celu zmiany na inny system liczbowy. Chodzi o:
- bin() – dwójkowy, z prefiksem 0b,
- oct() – ósemkowy, z prefiksem 0o,
- hex() – szesnastkowy, z prefiksem 0x.
Warto jednak zauważyć, że po zmianie wartości na inny system liczbowy pojawia się odpowiedni prefiks, którego można się pozbyć za pomocą slicingu lub lstrip().
1 2 3 4 | liczba = 504935 print(bin(liczba).lstrip('0b')) # binarna '1111011010001100111' print(oct(liczba).lstrip('0o')) # ósemkowa '1732147' print(hex(liczba).lstrip('0x')) # szesnastkowa '7b467' |
Inny system liczbowy na system dziesiętny
Można w tym celu użyć funkcji int() wraz z podaniem bazy systemu liczbowego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Liczby w różnych systemach liczbowych osemkowa = "261" szesnastkowa = "B1" binarna = "10110001" # Konwersja na system dziesiętny za pomocą funkcji int() dziesietna_z_osemkowej = int(osemkowa, 8) # Konwersja liczby ósemkowej na dziesiętną dziesietna_z_szesnastkowej = int(szesnastkowa, 16) # Konwersja liczby szesnastkowej na dziesiętną dziesietna_z_binarnej = int(binarna, 2) # Konwersja liczby binarnej na dziesiętną # Wyświetlenie wyników print("Liczba ósemkowa na dziesiętną:", dziesietna_z_osemkowej) print("Liczba szesnastkowa na dziesiętną:", dziesietna_z_szesnastkowej) print("Liczba binarna na dziesiętną:", dziesietna_z_binarnej) |
C++ – wbudowane funkcje
System dziesiętny na inny system liczbowy
Aby przekształcić liczbę z systemu dziesiętnego na inny system liczbowy, można użyć funkcji std::stringstream wraz z manipulatorem std::oct dla systemu ósemkowego, std::hex dla systemu szesnastkowego lub manipulatora std::bitset dla systemu binarnego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> #include <sstream> #include <bitset> using namespace std; int main() { int dziesietna = 177; stringstream strumienOsemkowy; strumienOsemkowy << oct << dziesietna; // Ustawiamy strumień na system ósemkowy string osemkowa = strumienOsemkowy.str(); // Pobieramy wynik jako string stringstream strumienSzesnastkowy; strumienSzesnastkowy << hex << dziesietna; // Ustawiamy strumień na system szesnastkowy string szesnastkowa = strumienSzesnastkowy.str(); // Pobieramy wynik jako string bitset<8> binarna(dziesietna); // Konwertujemy na system binarny przy użyciu std::bitset cout << "Liczba dziesiętna: " << dziesietna << endl; cout << "Liczba ósemkowa: " << osemkowa << endl; cout << "Liczba szesnastkowa: " << szesnastkowa << endl; cout << "Liczba binarna: " << binarna << endl; return 0; } |
Inny system liczbowy na system dziesiętny
Aby przekształcić liczbę z innego systemu liczbowego na system dziesiętny, można użyć funkcji std::stoi wraz z podaniem bazy systemu liczbowego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> #include <string> int main() { using namespace std; string osemkowa = "261"; string szesnastkowa = "B1"; string binarna = "10110001"; // Konwersja na system dziesiętny przy użyciu funkcji std::stoi int dziesietnaZDziesietnej = stoi(osemkowa, nullptr, 8); // nullptr jako drugi argument oznacza, że baza jest automatycznie wykrywana int dziesietnaZSzesnastkowej = stoi(szesnastkowa, nullptr, 16); int dziesietnaZBinarnej = stoi(binarna, nullptr, 2); cout << "Liczba ósemkowa na dziesiętną: " << dziesietnaZDziesietnej << endl; cout << "Liczba szesnastkowa na dziesiętną: " << dziesietnaZSzesnastkowej << endl; cout << "Liczba binarna na dziesiętną: " << dziesietnaZBinarnej << endl; return 0; } |
Java – wbudowane funkcje
System dziesiętny na inny system liczbowy
Można też użyć metody Integer.toOctalString(), Integer.toHexString() i Integer.toBinaryString() odpowiednio dla systemów ósemkowego, szesnastkowego i binarnego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.util.*; public class Main { public static void main(String[] args){ // Liczba dziesiętna int dziesietna = 177; // Konwersja na systemy ósemkowy, szesnastkowy i binarny String osemkowa = Integer.toOctalString(dziesietna); String szesnastkowa = Integer.toHexString(dziesietna); String binarna = Integer.toBinaryString(dziesietna); // Wyświetlenie wyników System.out.println("Liczba dziesiętna: " + dziesietna); System.out.println("Liczba ósemkowa: " + osemkowa); System.out.println("Liczba szesnastkowa: " + szesnastkowa); System.out.println("Liczba binarna: " + binarna); } } |
Inny system liczbowy na system dziesiętny
Można użyć konstruktora Integer.parseInt() wraz z podaniem bazy systemu liczbowego.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.util.*; public class Main { public static void main(String[] args){ // Liczby w różnych systemach liczbowych String osemkowa = "261"; String szesnastkowa = "B1"; String binarna = "10110001"; // Konwersja na system dziesiętny int dziesietnaZDziesietnej = Integer.parseInt(osemkowa, 8); // Konwersja liczby ósemkowej na dziesiętną int dziesietnaZSzesnastkowej = Integer.parseInt(szesnastkowa, 16); // Konwersja liczby szesnastkowej na dziesiętną int dziesietnaZBinarnej = Integer.parseInt(binarna, 2); // Konwersja liczby binarnej na dziesiętną // Wyświetlenie wyników System.out.println("Liczba ósemkowa na dziesiętną: " + dziesietnaZDziesietnej); System.out.println("Liczba szesnastkowa na dziesiętną: " + dziesietnaZSzesnastkowej); System.out.println("Liczba binarna na dziesiętną: " + dziesietnaZBinarnej); } } |
QUIZ – Sprawdź swoją wiedzę
Najczęściej zadawane pytania o systemy liczbowe
Jakie są systemy liczbowe w informatyce?
W informatyce najczęściej używane są systemy liczbowe: binarny (dwójkowy), ósemkowy (oktalny) i szesnastkowy (heksadecymalny). Pozwalają one efektywnie reprezentować dane oraz działać na nich.
Ile jest systemów liczbowych?
Teoretycznie istnieje nieskończona liczba pozycyjnych systemów liczbowych, ale w praktyce najczęściej spotykane są systemy liczbowe takie jak dziesiętny (decymalny), dwójkowy (binarny), ósemkowy (oktalny) oraz szesnastkowy (heksadecymalny).
Jak dzielimy systemy liczbowe?
Systemy liczbowe dzieli się na dwa rodzaje:
- Addytywne (niepozycyjne) – liczby tworzone są poprzez dodawanie do siebie wartości kolejnych symboli (przykładowo system rzymski czy egipski),
- Pozycyjne – jak sama nazwa wskazuje, w przypadku tych systemów istnieje ograniczony zbiór symboli, których wartość zależy od miejsca, na które zostaną wstawione.
Jakiego systemu liczbowego używa komputer?
Komputery używają systemu liczbowego binarnego (dwójkowego), ponieważ są one oparte na układach cyfrowych operujących na sygnałach elektrycznych (0 – brak sygnału i 1 – obecny sygnał). Wszystkie dane są przechowywane i przetwarzane w postaci binarnej.
Jakie są kody liczbowe?
Niektórzy mówią tak na systemy liczbowe. Wśród najczęściej stosowanych pozycyjnych systemów liczbowych można wymienić dziesiętny (decymalny), dwójkowy (binarny), ósemkowy (oktalny) oraz szesnastkowy (heksadecymalny). Jednak innym chodzi o tablicę kodów ASCII, BCD (Binary-Coded Decimal), Graya, U1 czy U2.
Czy istnieje system jedynkowy?
Oczywiście, że istnieje system jedynkowy, jest to jednak najbardziej prymitywny ze wszystkich systemów liczbowych, ponieważ występuje w nim tylko jeden znak (pionowa kreska lub 1). Wystarczy powtórzyć ten symbol, żeby uzyskać konkretną liczbę. Przykładowo dla odwzorowania wartości 4 należy użyć czterech pionowych kresek lub 1111. Co ciekawe, jest to system liczbowy, z którego korzysta się przy liczeniu na palcach. Wcześniej używano go, ryjąc kreski na kościach czy glinianych tabliczkach, a także plotąc węzełki na sznurkach.
To prosty system liczbowy, znajdujący zastosowanie dla niewielkich liczb. W przypadku większych wartości można go było usprawnić poprzez zbieranie wartości w mniejsze podzbiory, np. po pięć. Wówczas – wiedząc, że jedna grupka kresek to liczba 5 – wystarczyło policzyć powstałe w ten sposób zbiory, żeby uzyskać ostateczny wynik (przykładowo 5 zbiorów po 5 kresek to wartość 25).