Konwerter systemów liczbowych

Wpisz wartość w dowolne pole, a pozostałe przeliczą się natychmiast. Duże liczby obsługiwane przez BigInt, bez cichych błędów.

Wszystko liczy się w Twojej przeglądarce - dane nie są wysyłane na nasz serwer.

Cztery podstawowe systemy
Wpisz wartość w dowolne pole - pozostałe przeliczą się natychmiast.
Dowolna podstawa od 2 do 36
Wynik pojawi się tutaj.

Cyfry powyżej dziewiątki zapisujemy literami: a oznacza 10, z oznacza 35. Podstawa 36 wykorzystuje cały alfabet łaciński i daje najkrótszy zapis.

Operacje bitowe
Operacja bitowa

Wpisz oba argumenty i wybierz operację.
Tekst ⇄ zapis binarny
Wpisz tekst albo wklej ciąg bitów - konwersja działa w obie strony.
Właściwości liczby

Wszystkie obliczenia wykonujemy na typie BigInt, więc wynik pozostaje dokładny także powyżej bezpiecznego zakresu liczb całkowitych JavaScriptu, czyli powyżej 9 007 199 254 740 991.

Kroki konwersji
DzielnaIlorazReszta

Reszty czytane od dołu do góry dają zapis liczby w wybranym systemie. Tabelę pokazujemy dla wartości do 32 kroków - dłuższe liczby zajęłyby całą stronę.

Jak używać

  1. Wprowadź wartość w dowolne z czterech pól na górze, a pozostałe trzy przeliczą się natychmiast, bez klikania przycisku.
  2. Pole podświetli się na czerwono, gdy wpiszesz w nim cyfrę niedozwoloną w danym systemie, na przykład dwójkę w polu binarnym albo literę G w szesnastkowym.
  3. Liczby ujemne są obsługiwane, wystarczy postawić minus przed wartością. W sekcji operacji bitowych zobaczysz, jak taka liczba zachowuje się przy przesunięciach.
  4. Innej podstawy szukaj w sekcji „Dowolna podstawa od 2 do 36”. Ustaw podstawę źródłową i docelową, a wynik pojawi się od razu, bez zatwierdzania.
  5. W sekcji operacji bitowych wpisz dwa argumenty, wybierz działanie i odczytaj wynik w czterech zapisach naraz. Przesunięcia przyjmują w polu B liczbę pozycji.
  6. Na dole zamienisz tekst na ciąg bitów i z powrotem. Kodowanie to UTF-8, więc polska litera zajmuje dwa bajty, czyli 16 bitów.

Wskazówki

  • Wszystkie działania wykonujemy na typie BigInt. Zwykłe liczby w JavaScripcie tracą dokładność powyżej 9 007 199 254 740 991, więc konwerter oparty na parseInt po cichu poda błędny wynik dla większych wartości. Kliknij „Wstaw liczbę większą niż 2⁵³”, żeby to sprawdzić.
  • Operacja NOT na typie BigInt działa na nieskończonej reprezentacji uzupełnieniowej do dwóch, dlatego NOT z liczby dodatniej zawsze daje liczbę ujemną: NOT 12 wynosi −13. Taki wynik opisuje matematykę, którą 32-bitowy rejestr procesora tylko przycina do swojej szerokości.
  • Przesunięcie w prawo liczby ujemnej zachowuje znak, czyli jest przesunięciem arytmetycznym. W wielu językach istnieje osobny operator przesunięcia logicznego, który wstawia zera, ale wymaga on ustalonej szerokości słowa.
  • Podstawa 16 jest wygodna. Jedna cyfra szesnastkowa to dokładnie cztery bity, więc zapis hex czyta się jak skrócony zapis binarny. Podstawa 8 odpowiada trzem bitom i przetrwała głównie w uprawnieniach plików w systemach uniksowych, gdzie zapis 755 czyta się jako trzy trójki bitów.
  • Zapis binarny tekstu zależy od kodowania. Używamy UTF-8, w którym litera łacińska zajmuje jeden bajt, a polska dwa. W kodowaniu ISO-8859-2 polska litera zmieściłaby się w jednym bajcie, ale ten format praktycznie wyszedł z użycia.

Szesnastkową wartość koloru rozpisze na składowe konwerter kolorów, a dane binarne zamieni w bezpieczny tekst koder Base64.

Jak działa zapis pozycyjny w różnych systemach liczbowych

W systemie pozycyjnym wartość cyfry zależy od jej miejsca. System dziesiętny ma dziesięć cyfr, od 0 do 9, a kolejne pozycje mnożymy przez potęgi liczby 10, więc zapis 507 znaczy 5·10² + 0·10¹ + 7·10⁰. Ta sama zasada obowiązuje w każdej innej podstawie. Binarne 1011 to 1·2³ + 0·2² + 1·2¹ + 1·2⁰, czyli 11. Podstawa systemu mówi, ile różnych cyfr wchodzi w grę: dziesięć w podstawie 10, dwie w podstawie 2, osiem w podstawie 8 i szesnaście w podstawie 16.

Jak przeliczać liczby między podstawami

Zamiana w drugą stronę sprowadza się do kolejnego dzielenia z resztą. Dzielimy liczbę przez podstawę docelową, zapisujemy resztę, otrzymany wynik dzielimy ponownie i tak aż do zera. Reszty odczytane od ostatniej do pierwszej tworzą zapis liczby w nowym systemie. Tabela w kolumnie obok pokazuje te kroki dla wprowadzonej wartości dziesiętnej, więc widać, skąd bierze się każda cyfra.

Dlaczego BigInt jest tutaj konieczny

JavaScript przechowuje liczby jako wartości zmiennoprzecinkowe podwójnej precyzji. Daje to 53 bity mantysy, więc liczby całkowite są odwzorowane bez błędu do 9 007 199 254 740 991, czyli 2⁵³ − 1. Powyżej tej granicy dokładność znika. Kolejne wartości zaczynają się „sklejać”, bo dodanie jedynki do 2⁵³ niczego już nie zmienia.

Dla konwertera systemów liczbowych ma to poważne konsekwencje. Implementacja oparta na parseInt i toString zwróci dla 64-bitowego identyfikatora albo maski bitowej wartość błędną, i to bez żadnego ostrzeżenia. Typ BigInt, dodany do języka w 2020 roku, przechowuje liczby całkowite o dowolnej długości i wykonuje na nich działania dokładnie. Wszystkie obliczenia w tym narzędziu idą właśnie przez niego, co sprawdzisz, wprowadzając liczbę o trzydziestu cyfrach.

Operacje bitowe w praktyce

Koniunkcja bitowa AND służy najczęściej do maskowania, bo wynik zachowuje wyłącznie bity ustawione w obu argumentach. Alternatywa OR ustawia bity, a różnica symetryczna XOR je przełącza, stąd jej popularność w prostym szyfrowaniu i w sumach kontrolnych. Przesunięcie w lewo o jedną pozycję mnoży przez dwa, przesunięcie w prawo dzieli przez dwa z zaokrągleniem w dół. Sekcja operacji bitowych pracuje więc jak kalkulator, który ten sam wynik pokazuje od razu w czterech systemach liczbowych.

Typowe zastosowanie to flagi upakowane w jednej liczbie. Uprawnienia pliku w systemach uniksowych zapisane jako 644 to trzy grupy po trzy bity. Pierwszy bit w grupie oznacza odczyt, drugi zapis, trzeci uruchomienie, a same grupy odnoszą się kolejno do właściciela, jego grupy i pozostałych użytkowników. Sprawdzenie, czy właściciel może zapisywać, to operacja AND z maską 0o200. Podobnie czyta się pola bitowe w protokołach sieciowych i rejestry sterujące w elektronice, gdzie pojedynczy bit włącza konkretną funkcję układu.

Liczby ujemne i uzupełnienie do dwóch

Procesory zapisują liczby ujemne w kodzie uzupełnieniowym do dwóch, gdzie najstarszy bit oznacza znak, a wartość ujemna powstaje przez negację wszystkich bitów i dodanie jedynki. Odejmowanie sprowadza się wtedy do dodawania, a układ arytmetyczny jest prostszy. Zapis zależy jednak od szerokości słowa, bo liczba −1 to FF na ośmiu bitach i FFFFFFFF na trzydziestu dwóch.

BigInt nie ma ustalonej szerokości. Operuje na nieskończonym uzupełnieniu do dwóch, dlatego NOT z dwunastu daje minus trzynaście zamiast 243 czy 4294967283. Jeśli potrzebujesz wyniku dla konkretnej szerokości rejestru, weź resztę z dzielenia przez 2 do potęgi równej liczbie bitów. Panel właściwości pokazuje, ile bitów zajmuje wprowadzona wartość.

Tekst jako ciąg bitów

Komputer nie przechowuje liter. Trzyma liczby, a standard Unicode przypisuje każdemu znakowi numer, natomiast kodowanie decyduje, jak ten numer zapisać w bajtach. W UTF-8 znaki alfabetu łacińskiego zajmują jeden bajt i są zgodne ze starym kodem ASCII, znaki z ogonkami dwa bajty, większość znaków chińskich trzy, a emoji cztery.

To wyjaśnia, dlaczego polski tekst waży w plikach więcej niż angielski o tej samej liczbie znaków, i dlaczego wiadomość SMS z jedną polską literą skraca się ze 160 do 70 znaków, bo sieć przełącza się wtedy na kodowanie dwubajtowe. Konwerter na dole strony pokazuje ten mechanizm wprost: wpisz „a”, a potem „ą”, i porównaj długość obu zapisów binarnych.

Najczęstsze pytania

Jak przeliczać liczby w konwerterze systemów liczbowych?

Wprowadź liczbę w jednym z czterech pól na górze, czyli w polu dla systemu dwójkowego, ósemkowego, dziesiętnego albo szesnastkowego, a pozostałe trzy przeliczą się jeszcze w trakcie pisania. Dla podstaw spoza tej czwórki użyj sekcji „Dowolna podstawa od 2 do 36”, gdzie osobno ustawia się podstawę źródłową i docelową. Wynik kopiuje się przyciskiem obok pola, a panel właściwości podaje przy okazji liczbę bitów i bajtów.

Dlaczego inne konwertery podają złe wyniki dla dużych liczb?

Bo używają zwykłego typu liczbowego JavaScriptu, który odwzorowuje liczby całkowite bez błędu do 9 007 199 254 740 991. Powyżej tej granicy wyniki są zaokrąglane, i to bez ostrzeżenia. Tutaj wszystko liczymy na typie BigInt, który nie ma takiego ograniczenia. Kliknij „Wstaw liczbę większą niż 2⁵³”, żeby porównać oba zachowania.

Czy narzędzie obsługuje liczby ułamkowe?

Nie. Konwerter działa na liczbach całkowitych, bo to one występują w operacjach bitowych i w tym, co się na co dzień programuje. Zapis ułamków w innych podstawach wymaga osobnych reguł zaokrąglania, a wynik bywa nieskończony: jedna dziesiąta w systemie dwójkowym jest ułamkiem okresowym, dokładnie tak jak jedna trzecia w systemie dziesiętnym.

Co oznacza czerwona ramka wokół pola?

Że wpisany znak nie mieści się w zbiorze cyfr danego systemu. W polu dwójkowym dozwolone są tylko 0 i 1, w ósemkowym cyfry od 0 do 7, a w szesnastkowym cyfry i litery od a do f. Pozostałe pola nie zmieniają się wtedy do czasu poprawienia wartości, żeby nie pokazywać wyniku obliczonego z niepełnych danych.

Dlaczego NOT z liczby 12 daje −13, a nie 243?

Bo BigInt nie ma ustalonej szerokości słowa i pracuje na nieskończonym uzupełnieniu do dwóch. Wynik 243 dostałbyś w rejestrze ośmiobitowym, a 4294967283 w trzydziestodwubitowym. Jeśli potrzebujesz wyniku dla konkretnej szerokości, zastosuj maskę AND z wartością złożoną z samych jedynek o tej długości.

Ile bitów zajmuje polska litera?

Szesnaście, czyli dwa bajty w kodowaniu UTF-8. Litera alfabetu łacińskiego bez znaku diakrytycznego zajmuje osiem bitów. Zobaczysz to w sekcji „Tekst ⇄ zapis binarny”, gdzie słowo „kot” daje 24 bity, a „kość” - 40.

Czy dane wpisane w to narzędzie gdzieś trafiają?

Nie, wszystkie konwersje wykonuje Twoja przeglądarka. Nie wysyłamy wprowadzonych wartości na serwer i nigdzie ich nie zapisujemy. Możesz to sprawdzić w zakładce „Sieć” w narzędziach deweloperskich, gdzie podczas przeliczania nie pojawi się żadne zapytanie.