Gdy widzisz zapis 101101, komputer odczytuje go inaczej niż człowiek przyzwyczajony do systemu dziesiętnego. Zamiana liczby binarnej na dziesiętną polega na przypisaniu kolejnym cyfrom odpowiednich potęg liczby 2, a potem zsumowaniu wyników. Pokażę prostą metodę ręczną, przykłady z częścią ułamkową, sposób programistyczny oraz błędy, przez które wynik często się nie zgadza.
Najważniejsze zasady pozwalają przeliczyć zapis binarny bez zgadywania
- System binarny używa wyłącznie cyfr 0 i 1.
- Prawa skrajna cyfra ma wagę 20 = 1, a każda kolejna po lewej dwukrotnie większą.
- Liczbę całkowitą oblicza się przez mnożenie cyfr przez potęgi 2 i dodawanie wyników.
- Algorytm Hornera pozwala wykonywać konwersję szybko i bez wypisywania potęg.
- W programie trzeba sprawdzić, czy wejście zawiera wyłącznie 0 oraz 1.
Dlaczego zapis binarny ma inną wartość niż wygląda
W systemie dziesiętnym każda pozycja ma wagę będącą potęgą liczby 10. W zapisie 352 cyfra 3 oznacza 3 × 100, cyfra 5 oznacza 5 × 10, a cyfra 2 oznacza 2 × 1. System binarny działa identycznie, tylko jego podstawą jest liczba 2.
Dlatego zapis 11012 nie oznacza tysiąca stu jeden. Poszczególne pozycje mają wartości 8, 4, 2 i 1. Cyfry binarne wskazują, które z tych wartości należy dodać:
| Cyfra | Potęga 2 | Waga pozycji | Wynik mnożenia |
|---|---|---|---|
| 1 | 23 | 8 | 1 × 8 = 8 |
| 1 | 22 | 4 | 1 × 4 = 4 |
| 0 | 21 | 2 | 0 × 2 = 0 |
| 1 | 20 | 1 | 1 × 1 = 1 |
Po dodaniu wartości otrzymujemy 8 + 4 + 0 + 1 = 13. To właśnie najważniejsza zasada całej konwersji. Zera nie zwiększają wyniku, ale zajmują pozycję i dlatego nie wolno ich pomijać przed wykonaniem obliczeń.
Jak przeliczyć liczbę binarną ręcznie
Najwygodniej zacząć od prawej strony. Prawej skrajnej cyfrze przypisuję wagę 20, czyli 1. Każda kolejna pozycja w lewo otrzymuje wagę dwa razy większą: 2, 4, 8, 16 i tak dalej.
Przykład z liczbą 101101
Rozpiszmy liczbę 1011012 od prawej strony:
1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20
Po obliczeniu potęg i pomnożeniu cyfr dostajemy:
32 + 0 + 8 + 4 + 0 + 1 = 45
Zatem 1011012 = 4510. Ten przykład dobrze pokazuje, że nie trzeba wykonywać żadnych skomplikowanych działań. Wystarczy pilnować numeracji pozycji i zaczynać od zera po prawej stronie.
Krótki przykład dla ośmiu bitów
W informatyce często spotkasz zapis o długości 8 bitów, na przykład 11001010. Wagi kolejnych pozycji wynoszą 128, 64, 32, 16, 8, 4, 2 i 1.
110010102 = 128 + 64 + 0 + 0 + 8 + 0 + 2 + 0 = 20210
Stała długość zapisu nie zmienia wartości. Liczby 101, 00000101 i 000000000101 oznaczają tę samą wartość, czyli 5, jeśli poprzedzające zera są tylko dopełnieniem zapisu.
Konwersja części ułamkowej i liczb ujemnych
Po przecinku zasada nadal działa, ale potęgi liczby 2 mają ujemne wykładniki. Pierwsza cyfra po przecinku ma wagę 2-1 = 0,5, następna 2-2 = 0,25, a każda kolejna jest o połowę mniejsza.
Przykład 101,1012 można zapisać tak:
1 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3
Obliczenie wygląda następująco: 4 + 0 + 1 + 0,5 + 0 + 0,125 = 5,625. Otrzymujemy więc 101,1012 = 5,62510.
Przy liczbach ujemnych trzeba uważać. Sam zapis bitów nie zawsze wystarcza, ponieważ znaczenie zależy od przyjętej reprezentacji. Na przykład osiem bitów 11111111 oznacza 255 przy interpretacji bez znaku, ale w typowym zapisie uzupełnienia do dwóch może oznaczać -1. W zadaniach szkolnych najczęściej konwertuje się liczby dodatnie, natomiast w programowaniu trzeba znać typ danych i jego zakres.
Jak zrobić to w programie
W kodzie można skorzystać z gotowej funkcji albo napisać własny algorytm. Gotowe rozwiązanie jest krótkie, ale własna implementacja lepiej pokazuje, co naprawdę dzieje się podczas przeliczania i przydaje się w nauce podstaw programowania.
Gotowe funkcje w Pythonie i JavaScripcie
W Pythonie podstawą systemu podaje się jako drugi argument funkcji int():
liczba = int("101101", 2)
print(liczba) # 45
W JavaScripcie podobną rolę pełni parseInt():
const liczba = parseInt("101101", 2);
console.log(liczba); // 45
Drugi argument, czyli 2, jest bardzo ważny. Informuje program, że tekst ma być odczytany jako liczba w systemie dwójkowym. Pominięcie tego argumentu może prowadzić do nieczytelnego kodu albo nieoczekiwanej interpretacji danych.
Przeczytaj również: Znak nierówności w programowaniu - !=, !== i ≠ w praktyce
Algorytm Hornera bez potęg
Praktyczniejsza metoda polega na przechodzeniu od lewej do prawej. Za każdym razem aktualny wynik mnożę przez 2 i dodaję bieżącą cyfrę. Dla ciągu 101101 wygląda to tak:
| Krok | Działanie | Wynik |
|---|---|---|
| 1 | 0 × 2 + 1 | 1 |
| 2 | 1 × 2 + 0 | 2 |
| 3 | 2 × 2 + 1 | 5 |
| 4 | 5 × 2 + 1 | 11 |
| 5 | 11 × 2 + 0 | 22 |
| 6 | 22 × 2 + 1 | 45 |
Własna funkcja w Pythonie może wyglądać tak:
def binarna_na_dziesietna(tekst):
wynik = 0
for znak in tekst:
if znak not in ("0", "1"):
raise ValueError("Dozwolone są tylko cyfry 0 i 1")
wynik = wynik * 2 + int(znak)
return wynik
print(binarna_na_dziesietna("101101")) # 45
Algorytm wykonuje jeden obieg po znakach, więc dla liczby mającej n bitów działa w czasie O(n). To rozwiązanie jest czytelne, szybkie i nie wymaga tworzenia tablicy potęg liczby 2.
Najczęstsze błędy podczas obliczeń
Najczęściej problemem nie jest samo dodawanie, ale pomylenie kierunku liczenia. Waga 1 zawsze znajduje się po prawej stronie, nie po lewej. Jeśli zaczniesz przypisywać potęgi od lewej krawędzi, otrzymasz błędny wynik.
- Traktowanie zapisu binarnego jak dziesiętnego, na przykład odczytanie 101 jako sto jeden.
- Rozpoczęcie potęgowania od 21 zamiast od 20.
- Pominięcie zer bez uwzględnienia ich pozycji.
- Wpisanie cyfry większej niż 1, na przykład 1021, która nie jest poprawną liczbą binarną.
- Pomylenie liczby bez znaku z liczbą ze znakiem przy analizie pełnych bajtów.
Sam sprawdzam wynik drugą metodą, gdy liczba ma więcej niż kilka bitów. Można na przykład obliczyć go najpierw przez potęgi, a potem algorytmem Hornera. Jeśli wyniki są różne, niemal zawsze błąd tkwi w przypisaniu wag albo w przepisaniu cyfry.
Dobrym szybkim testem jest też znalezienie największej potęgi dwójki obecnej w zapisie. Dla 101101 jest to 32, więc wynik musi być większy lub równy 32 i mniejszy od 64. Otrzymane 45 mieści się w tym zakresie, więc obliczenie jest prawdopodobne.
Co zapamiętać przed kolejnym zadaniem
Najkrótsza reguła brzmi: zacznij od prawej strony, przypisz pozycjom potęgi liczby 2 i dodaj wartości stojące przy cyfrach 1. W programie możesz użyć gotowej funkcji, ale znajomość algorytmu Hornera pozwala łatwo napisać własną konwersję i lepiej rozumieć działanie systemów liczbowych.
Przy prostych liczbach wystarczy kartka i kilka wag, a przy dłuższych zapisach najlepiej sprawdzi się kod lub kalkulator. Zawsze upewnij się jednak, że wejście zawiera tylko 0 i 1, a przy liczbach ujemnych sprawdź, czy zapis jest bez znaku, czy wykorzystuje uzupełnienie do dwóch.