Gdy zaczynasz programować, szybko trafiasz na system binarny - zapis, w którym występują wyłącznie cyfry 0 i 1. Na pierwszy rzut oka ciąg taki jak 101101 może wyglądać przypadkowo, ale każda jego pozycja ma konkretną wartość. Pokażę, jak czytać takie liczby, zamieniać je na zapis dziesiętny, wykorzystywać w kodzie oraz rozumieć rolę bitów i bajtów.
Dwa znaki wystarczą do zapisu liczb i informacji
- Podstawa 2 oznacza, że zapis korzysta tylko z cyfr 0 i 1.
- Każda pozycja ma wagę będącą kolejną potęgą liczby 2.
- Liczbę binarną na dziesiętną można zamienić przez sumowanie wartości pozycji.
- Zapis dziesiętny na binarny najłatwiej uzyskać przez dzielenie przez 2 i zapisywanie reszt.
- 8 bitów tworzy bajt, który może przechowywać 256 różnych wartości bez znaku.
- W JavaScript i Pythonie konwersję wykonują gotowe funkcje, ale rozumienie mechanizmu pomaga unikać błędów.
Na czym polega zapis oparty na dwóch cyfrach
W systemie dziesiętnym każda pozycja ma wagę będącą potęgą liczby 10. W liczbie 583 cyfra 5 oznacza pięć setek, 8 osiem dziesiątek, a 3 trzy jedności. W zapisie binarnym działa dokładnie ta sama zasada, tylko podstawą jest liczba 2.
Od prawej strony kolejne pozycje mają więc wartości 1, 2, 4, 8, 16, 32 i tak dalej. Cyfra 1 oznacza, że daną wartość dodajemy, a 0, że ją pomijamy. Przykład 10110₂ można rozpisać tak:
| Pozycja | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Cyfra | 1 | 0 | 1 | 1 | 0 |
Wynik to 16 + 0 + 4 + 2 + 0, czyli 22 w systemie dziesiętnym. Indeks dolny 2 jest pomocny w podręcznikach i zadaniach, bo jasno pokazuje podstawę. W kodzie częściej spotkasz prefiks, na przykład 0b10110.
To, co początkujących zwykle myli, to długość zapisu. Liczba 00101 ma tę samą wartość co 101, ponieważ zera z lewej strony nie zwiększają wartości. Mogą jednak mieć znaczenie przy pracy z ustaloną liczbą bitów, na przykład przy adresach, maskach i danych zapisanych zawsze w 8-bitowych blokach.
Jak zamienić zapis binarny na dziesiętny
Najprostsza metoda polega na przypisaniu każdej cyfrze odpowiedniej potęgi dwójki, a potem dodaniu tylko tych wartości, przy których stoi 1. Nie trzeba zapamiętywać skomplikowanego wzoru. Wystarczy znać ciąg 1, 2, 4, 8, 16, 32, 64, 128.
Przykład dla liczby 110101
Rozpiszmy cyfry od prawej strony:
| Potęga | 2⁵ | 2⁴ | 2³ | 2² | 2¹ | 2⁰ |
|---|---|---|---|---|---|---|
| Wartość | 32 | 16 | 8 | 4 | 2 | 1 |
| Cyfra | 1 | 1 | 0 | 1 | 0 | 1 |
Dodajemy wartości stojące pod jedynkami: 32 + 16 + 4 + 1. Otrzymujemy 53. Taki sposób jest dobry na początku nauki, bo pokazuje, skąd bierze się wynik, zamiast sprowadzać konwersję do bezmyślnego użycia kalkulatora.
Konwersja w drugą stronę
Aby zamienić liczbę dziesiętną na zapis binarny, dzielimy ją przez 2 i zapisujemy resztę z każdego dzielenia. Wynik odczytujemy od dołu do góry.
| Działanie | Iloraz | Reszta |
|---|---|---|
| 13 ÷ 2 | 6 | 1 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 1 ÷ 2 | 0 | 1 |
Reszty czytane od ostatniej do pierwszej dają 1101₂. Najczęstszy błąd polega właśnie na zapisaniu ich w kolejności wykonywania obliczeń, co dałoby błędne 1011. W praktyce zawsze można sprawdzić wynik, zamieniając otrzymany zapis z powrotem na dziesiętny.
Jak wykonywać działania na liczbach binarnych
Dodawanie działa podobnie jak w systemie dziesiętnym, ale mamy tylko dwie cyfry. Najważniejsze reguły są krótkie:
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 0 = 1
- 1 + 1 = 10, czyli zapisujemy 0 i przenosimy 1 do następnej pozycji
Przykład 1011 + 0110 daje 10001. Po zamianie na wartości dziesiętne otrzymujemy 11 + 6 = 17, więc wynik można łatwo zweryfikować inną metodą.
W programowaniu ważne są również operacje bitowe. Operator AND zwraca 1 tylko wtedy, gdy oba bity mają wartość 1, OR zwraca 1, gdy przynajmniej jeden bit ma wartość 1, a XOR zwraca 1, gdy bity są różne.
| Operacja | Przykład | Wynik | Zastosowanie |
|---|---|---|---|
| AND | 1100 & 1010 | 1000 | Sprawdzanie wybranych bitów |
| OR | 1100 | 1010 | 1110 | Ustawianie bitów |
| XOR | 1100 ^ 1010 | 0110 | Porównywanie różnic |
Na tym etapie nie trzeba jeszcze używać operacji bitowych w każdym projekcie. Są jednak przydatne przy flagach, uprawnieniach, kompresji, grafice i pracy z protokołami. Sam traktuję je jako narzędzie specjalistyczne, a nie obowiązkowy zamiennik zwykłych operatorów matematycznych.
Bity, bajty i dane przechowywane przez komputer
Bit to najmniejsza jednostka informacji i może przyjąć wartość 0 albo 1. Osiem bitów tworzy bajt, a więc blok pozwalający zapisać 256 różnych kombinacji, od 00000000 do 11111111. W zapisie bez znaku daje to zakres od 0 do 255.
Rozmiar danych często opisuje się właśnie przez bajty, kilobajty, megabajty i gigabajty. W programowaniu warto rozróżniać zapis dziesiętny stosowany do wygodnego odczytu od binarnej reprezentacji, która pokazuje, jak informacja jest organizowana na niskim poziomie.
Liczby, tekst i kolory
Komputer przechowuje nie tylko liczby. Litera, obraz, dźwięk i instrukcja programu są ostatecznie reprezentowane jako dane, które można opisać ciągami bitów. Litera A ma w ASCII wartość 65, czyli 1000001₂, ale współczesne teksty często korzystają z Unicode i kodowania UTF-8, gdzie jeden znak może zajmować od 1 do 4 bajtów.
Dobrym przykładem ze świata webu jest kolor zapisany jako #FF0000. To forma szesnastkowa, wygodniejsza od długiego ciągu zer i jedynek. Poszczególne pary znaków opisują natężenie czerwieni, zieleni i niebieskiego, a każda z tych wartości mieści się w zakresie 0-255.
Warto też pamiętać o liczbach ujemnych. Komputery często przechowują je w kodzie uzupełnień do dwóch, czyli reprezentacji, w której najbardziej znaczący bit wpływa na znak. Dla 8 bitów typowy zakres wynosi od -128 do 127, a nie od 0 do 255. To drobny szczegół, który potrafi wyjaśnić zaskakujący wynik operacji bitowej.
Jak korzystać z zapisu binarnego w kodzie
W językach programowania nie musisz ręcznie przeliczać każdej wartości. JavaScript pozwala zapisać literał binarny z prefiksem 0b, a funkcja parseInt przyjmuje podstawę liczby jako drugi argument.
const liczba = 0b1011;
console.log(liczba); // 11
console.log(parseInt("1011", 2)); // 11
console.log(11 .toString(2)); // "1011"
W tym przykładzie 1011 jako tekst jest czymś innym niż liczba zapisana w kodzie jako 0b1011. To rozróżnienie ma praktyczne znaczenie. Tekst zachowuje na przykład zera początkowe, dlatego przy pracy z kodami, maskami lub danymi o stałej długości warto najpierw ustalić, czy potrzebujesz wartości liczbowej, czy ciągu znaków.
Przeczytaj również: Full stack - co to jest i jak zacząć? Praktyczny przewodnik
Ręczna konwersja jako ćwiczenie programistyczne
Jeżeli chcesz przećwiczyć pętle i operatory, możesz napisać własną funkcję zamieniającą liczbę dziesiętną na binarną:
function naBinarny(liczba) {
if (liczba === 0) return "0";
let wynik = "";
while (liczba > 0) {
wynik = (liczba % 2) + wynik;
liczba = Math.floor(liczba / 2);
}
return wynik;
}
console.log(naBinarny(13)); // "1101"
Funkcja wykorzystuje resztę z dzielenia przez 2 i dokleja ją z lewej strony wyniku. W prawdziwej aplikacji skorzystałbym z gotowej metody, ale ćwiczenie dobrze pokazuje działanie pętli, dzielenia całkowitego i operatora modulo. Warto dodać obsługę liczb ujemnych i sprawdzenie poprawności danych, jeśli funkcja ma trafić do większego projektu.
Typowe błędy początkujących
Pierwszy błąd to traktowanie zapisu 1010 jak liczby dziesiętnej. Bez informacji o podstawie nie zawsze wiadomo, jak interpretować zapis, dlatego w zadaniach używa się oznaczeń takich jak 1010₂ albo 0b1010.
Drugi problem to pomijanie zer początkowych tam, gdzie mają znaczenie. Wartości 5 i 00000101 są matematycznie równe, ale pierwsza reprezentuje zwykłą liczbę, a druga może być ośmiobitową maską. W protokołach i strukturach danych długość zapisu bywa równie istotna jak jego wartość.
Trzeci błąd wiąże się z mieszaniem bitów i bajtów. 1 bajt to 8 bitów, ale 1 kilobajt może oznaczać 1000 bajtów w zapisie dziesiętnym albo 1024 bajty w tradycyjnym ujęciu informatycznym. Przy rozmiarach plików najlepiej sprawdzić, jaką konwencję przyjmuje konkretne narzędzie.
Nie polecam też uczenia się samych tabel bez rozumienia pozycji. Jeśli zapamiętasz, że każda kolejna pozycja jest dwa razy większa od poprzedniej, odtworzysz potrzebne wartości nawet po dłuższej przerwie. To daje znacznie większą swobodę podczas debugowania i pracy z dokumentacją.
Od pierwszych bitów do świadomego programowania
Najważniejsza umiejętność nie polega na szybkim przepisywaniu ciągów 0 i 1. Chodzi o rozpoznanie, co reprezentuje dany zapis, ile zajmuje miejsca i jak program interpretuje jego wartość.
Na początek przećwicz zamianę kilku liczb, na przykład 5, 10, 15, 32 i 64, a potem sprawdź te same wyniki w JavaScript. Gdy swobodnie odczytasz pozycje, dodasz liczby binarne i rozróżnisz bit od bajtu, operacje bitowe przestaną wyglądać jak tajemniczy detal z wnętrza komputera.
W codziennym programowaniu najczęściej będziesz korzystać z zapisu dziesiętnego lub szesnastkowego, bo są wygodniejsze dla człowieka. Znajomość podstaw dwójkowej reprezentacji nadal robi różnicę, szczególnie przy debugowaniu danych, kolorach, kodowaniu znaków, pamięci i komunikacji między systemami.