Programiści

Jak Działa Konwersja Systemów Liczbowych (Binarny, Oktalny, Hex)

8 min czytania

Konwersja systemu liczbowego to zamiana tej samej wartości na zapis w innej podstawie: dziesiętnej, binarnej, oktalnej albo szesnastkowej. Robi się to ręcznie dwiema metodami, dzieleniem z resztą przy przejściu z dziesiętnego na inną podstawę, albo odczytem wartości pozycyjnych przy powrocie do dziesiętnego. Poniżej obie metody na pełnych przykładach liczbowych, które możesz sprawdzić krok po kroku.

Czym właściwie jest podstawa systemu liczbowego

System liczbowy (podstawa, po angielsku radix) określa, ile unikalnych cyfr ma do dyspozycji zapis pozycyjny. System dziesiętny (podstawa 10) używa cyfr 0-9. Binarny (podstawa 2) ma tylko 0 i 1. Oktalny (podstawa 8) używa 0-7. Szesnastkowy (podstawa 16) potrzebuje 16 symboli, więc po wyczerpaniu cyfr 0-9 sięga po litery A-F, gdzie A oznacza 10, a F oznacza 15.

Każda pozycja cyfry w liczbie to potęga podstawy. W liczbie dziesiętnej 202 cyfra 2 na miejscu setek nie znaczy po prostu “2”, tylko 2 x 10^2, czyli 200. Cyfra 0 na miejscu dziesiątek to 0 x 10^1. Cyfra 2 na miejscu jedności to 2 x 10^0, czyli po prostu 2. Zsumowane: 200 + 0 + 2 = 202. Ten sam mechanizm działa identycznie w każdej innej podstawie, tylko zamiast potęg 10 liczysz potęgi 2, 8 albo 16.

Konwersja liczby dziesiętnej na binarną, oktalną i szesnastkową: przykład 202

Weźmy liczbę dziesiętną 202 i przeliczmy ją na wszystkie trzy pozostałe podstawy.

Metoda dzielenia z resztą działa dla dowolnej podstawy docelowej: dziel liczbę przez podstawę, zapisz resztę, dziel wynik dalej, aż dojdziesz do zera, a na końcu odczytaj reszty od dołu do góry.

Dla podstawy 8 (oktalnej):

KrokDzielenieWynikReszta
1202 / 8252
225 / 831
33 / 803

Czytając reszty od ostatniej do pierwszej (3, 1, 2) dostajesz wynik oktalny: 312.

Dla podstawy 16 (szesnastkowej):

KrokDzielenieWynikReszta
1202 / 161210 (A)
212 / 16012 (C)

Czytając reszty od dołu (C, A) dostajesz wynik szesnastkowy: CA.

Metoda wartości pozycyjnej jest wygodniejsza dla binarnego: znajdź największą potęgę 2, która mieści się w liczbie, odejmij ją, i powtarzaj, aż zostanie zero.

Potęga 2WartośćMieści się w 202?Zostaje
2^7128tak, 202 - 128 = 7474
2^664tak, 74 - 64 = 1010
2^532nie10
2^416nie10
2^38tak, 10 - 8 = 22
2^24nie2
2^12tak, 2 - 2 = 00
2^01nie0

Bity ustawione na 1 to te przy 128, 64, 8 i 2. Suma się zgadza: 128 + 64 + 8 + 2 = 202. Zapisując wszystkie osiem pozycji od 2^7 do 2^0 dostajesz 11001010.

Podsumowanie dla 202: binarnie 11001010, oktalnie 312, szesnastkowo CA.

Odczytywanie oktalnych i szesnastkowych liczb z powrotem na dziesiętne: przykład 755

Ten kierunek konwersji trafia się w praktyce nawet częściej, bo to ty dostajesz liczbę w innej podstawie i musisz zrozumieć, co ona znaczy. Klasyczny przykład to uprawnienia plików w Unixie: polecenie chmod 755 widujesz bez końca w skryptach wdrożeniowych i dokumentacji serwerów, więc warto wiedzieć, co ta oktalna liczba naprawdę reprezentuje.

Żeby przeliczyć oktalne 755 na dziesiętne, mnóż każdą cyfrę przez odpowiednią potęgę 8, licząc od prawej:

CyfraPozycjaPotęga 8Obliczenie
7trzecia od prawej8^2 = 647 x 64 = 448
5druga od prawej8^1 = 85 x 8 = 40
5pierwsza od prawej8^0 = 15 x 1 = 5

Suma: 448 + 40 + 5 = 493. To dziesiętny odpowiednik oktalnego 755.

Binarnie ta sama wartość to 111101101. Zamiast liczyć od zera, skorzystaj z gotowej sztuczki: każda cyfra oktalna odpowiada dokładnie 3 bitom binarnym, więc wystarczy przełożyć cyfry osobno. 7 to 111, 5 to 101, kolejne 5 to znowu 101. Sklejone razem: 111 101 101, czyli dokładnie 755 czytane jako uprawnienia właściciela (7 = odczyt+zapis+wykonanie), grupy (5 = odczyt+wykonanie) i pozostałych (5 = odczyt+wykonanie).

Ta sama liczba w szesnastkowym to 1ED. Tutaj działa analogiczna zależność: każda cyfra hex odpowiada dokładnie 4 bitom, czyli jednej “połówce bajtu” (ang. nibble). To dlatego hex jest tak wygodny w informatyce: adresy pamięci, kody kolorów w stylu #RRGGBB czy wartości bajtów zajmują dwa razy mniej znaków niż ten sam zapis binarny, a mimo to każdy hex-znak da się rozłożyć na cztery bity bez reszty. 0xFF to tylko dwa znaki, ale to wciąż osiem bitów binarnych.

Oktal ma podobne uzasadnienie historyczne: w erze komputerów o słowach maszynowych podzielnych przez 3 bity był naturalnym skrótem zapisu binarnego, i właśnie stąd wzięła się jego obecność w uprawnieniach plików Unixa, gdzie trzy bity (odczyt, zapis, wykonanie) idealnie pasują do jednej cyfry oktalnej.

Wypróbuj z własnymi liczbami

Zamiast liczyć wszystko na kartce, wpisz dowolną wartość w dowolnym z czterech pól poniżej, a pozostałe trzy podstawy przeliczą się automatycznie.

Konwerter Systemów Liczbowych
Za darmo, bez rejestracji, na każdym urządzeniu.
Otwórz pełne narzędzie

Częste błędy i przypadki szczególne

Mylenie zapisu ze znakiem minus z uzupełnieniem do dwóch. Konwerter pokazuje liczby ujemne w reprezentacji ze znakiem i wartością bezwzględną (sign-magnitude), czyli po prostu znak minus przed cyframi. Dziesiętne -18 daje binarnie -10010, oktalnie -22, szesnastkowo -12. To nie jest uzupełnienie do dwóch, techniki powszechnej w językach programowania niskiego poziomu, gdzie ta sama wartość -18 zapisana jako 8-bitowa liczba ze znakiem wyglądałaby zupełnie inaczej, jako 11101110. Wielu programistów spodziewa się tego drugiego zapisu i zaskakuje ich, że narzędzie pokazuje zwykły minus przed magnitudą zamiast bitowej negacji. Warto to mieć z tyłu głowy, kiedy porównujesz wynik z tym, co zwraca kompilator albo debugger.

Traktowanie wielkości liter w hex jako istotnej przy wpisywaniu. Możesz wpisać ca albo CA, oba warianty zostaną odczytane identycznie jako wartość 202. Konwerter zawsze wyświetla wynik szesnastkowy wielkimi literami, niezależnie od tego, jak wpisałeś dane wejściowe.

Ignorowanie zer wiodących. 00CA i CA to dokładnie ta sama wartość w każdej podstawie, zera na początku nie zmieniają wielkości liczby, tak samo jak 007 i 7 w systemie dziesiętnym.

Zakładanie nieograniczonej precyzji. Narzędzie działa poprawnie dla liczb całkowitych w bezpiecznym zakresie JavaScriptu, praktycznie do około 2^53 - 1, czyli kilku bilionów. Dla wartości większych od tego progu precyzja obliczeń zaczyna się psuć, więc do naprawdę gigantycznych liczb potrzebna jest specjalizowana biblioteka dużych liczb całkowitych.

Wpisywanie prefiksów językowych zamiast samych cyfr. W kodzie źródłowym często zapisujesz liczbę binarną jako 0b1101, oktalną jako 0o17 albo szesnastkową jako 0xFF, bo tego wymaga składnia danego języka programowania. Ten konwerter oczekuje samych cyfr, bez prefiksu: wpisz 1101, 17 albo FF, a nie 0b1101, 0o17 czy 0xFF, inaczej narzędzie potraktuje prefiks jako nieprawidłowy znak.

Uwaga na marginesie: liczba dziesiętna 4096, czyli 2^12, jest wygodnym przykładem potęgi dwójki, bo w każdej podstawie wygląda okrągło: binarnie 1000000000000, oktalnie 10000, szesnastkowo 1000. Warto to zapamiętać jako punkt odniesienia przy szybkim szacowaniu wielkości liczb w innych podstawach.

Najczęściej zadawane pytania

Czym różni się podstawa liczbowa od zwykłej liczby? Podstawa (radix) to nie wartość, tylko reguła zapisu, czyli ile unikalnych cyfr ma dany system pozycyjny, zanim zacznie przenosić na kolejną pozycję. System dziesiętny przenosi po dziesięciu cyfrach (0-9), binarny po dwóch (0-1), oktalny po ośmiu (0-7), a szesnastkowy po szesnastu (0-9 plus A-F). Ta sama wartość liczbowa, na przykład 202, ma zupełnie inny zapis w każdej z tych podstaw, choć reprezentuje dokładnie tę samą ilość.

Dlaczego programiści tak często sięgają po zapis szesnastkowy zamiast binarnego? Bo hex jest dokładnie cztery razy krótszy przy zachowaniu pełnej odwracalności: każda cyfra szesnastkowa odpowiada dokładnie czterem bitom binarnym, więc konwersja tam i z powrotem jest trywialna, a zapis o wiele czytelniejszy dla człowieka. Osiem bitów binarnych (jeden bajt) mieści się w dwóch znakach hex, stąd wszechobecność hex w adresach pamięci, kodach kolorów i identyfikatorach błędów.

Jak ręcznie przeliczyć liczbę binarną na dziesiętną? Zsumuj potęgi dwójki tam, gdzie stoi cyfra 1, licząc pozycje od prawej, zaczynając od 2^0. Dla binarnego 11001010 sumujesz 2^7 (128), 2^6 (64), 2^3 (8) i 2^1 (2), co daje 128+64+8+2 = 202. Dokładnie odwrotny kierunek metody odejmowania potęg, którą pokazaliśmy wyżej.

Jaka jest największa liczba, którą obsłuży ten konwerter? Praktyczna górna granica to bezpieczny zakres liczb całkowitych JavaScriptu, w przybliżeniu do 2^53 - 1, czyli kilka bilionów. Powyżej tego progu obliczenia zaczynają tracić precyzję, więc do ekstremalnie dużych wartości lepiej użyć dedykowanej biblioteki dużych liczb.

Czy narzędzie obsługuje liczby ujemne? Tak. Wpisz znak minus przed dowolną wartością w dowolnym z czterech pól, a pozostałe trzy pokażą ujemny odpowiednik w reprezentacji ze znakiem i wartością bezwzględną, nie w uzupełnieniu do dwóch. Przykład: dziesiętne -18 daje binarnie -10010, oktalnie -22, szesnastkowo -12.

Czy mogę wysłać komuś link z gotowymi wartościami wpisanymi z góry? Tak. Adres URL aktualizuje się automatycznie, gdy wpisujesz dane, więc wystarczy skopiować link z paska adresu albo użyć przycisku udostępniania na pełnej stronie narzędzia. Osoba, która otworzy taki link, od razu zobaczy Twoje wartości gotowe we wszystkich czterech polach.

BinarnySzesnastkowySystemy liczboweProgramowanie
Konwerter Systemów Liczbowych
Teraz wypróbuj samodzielnie w pełnym narzędziu.
Wypróbuj teraz