System binarny

Liczby, liczby, liczby - są z nami od tysiącleci - próbujemy je uporządkować, przekształcić, zrozumieć i zapisać. Jednym z wynalezionych systemów liczbowych jest system binarny, który stanowi podstawę dla całego świata IT. Poznaj świat zer i jedynek.

System binarny - tranzystory PAGES.POST.COVER_THUMBNAIL.BY_WHOM YouraPechkin

Z tego artykułu dowiesz się:

  • W jaki system liczbowy wierzyli Słowianie?

  • Co system dwójkowy miał wspólnego z prognozowaniem pogody w starożytnych Chinach?

  • Jak przekształcić liczbę dziesiętną na binarną i odwrotnie?

  • Co to jest stack overflow?

  • Ile 0 i 1 zmieści się na dysku o pojemności jednego terabajta?

Liczenie wydaje się jedną z najbardziej podstawowych umiejętności człowieka. Jest jedną z pierwszych rzeczy, którą uczymy nasze potomstwo, zaraz po jedzeniu, chodzeniu i mówieniu. Pojawiło się w naszym społeczeństwie już bardzo dawno temu, kiedy tylko pojawiła się pierwsza potrzeba określenia ilości przedmiotów - stanu posiadania, handlu. Według archeologów pierwsze próby zapisu liczb pojawiły się już około 10 - 11 tysięcy lat temu (chociaż niektóre źródła sięgają jeszcze dalej).

Oczywiście pierwsze próby zapisu nie były zbyt wydajne. Liczby zapisywano za pomocą kresek na glinianych tabliczkach, korze drzew czy kamieniach. Wielkość liczby określała długość linii, którą zapisano. Ten system liczbowy to tak zwany system liczbowy jednostek (inaczej nazywany również systemem jedynkowym). Z czasem jednak człowiek odkrył, że taka forma zapisu jest mało wydajna i dość czasochłonna. Zaczęliśmy grupować liczby po 3, 5 lub 10. Każda grupa była określona przez swój własny znak. Pewnie pomogła nam budowa anatomiczna ludzkiej dłoni - najwcześniej odkryliśmy grupy 5 i 10.  I choć brzmi to naiwnie - od zawsze liczenie na palcach było najprzystępniejsze. To odkrycie pozwoliło nam rozwinąć systemy liczbowe, które znamy obecnie. 

W zależności od regionu każda społeczność wykorzystywała specyficzne dla siebie oznaczanie liczb. Czasami były to odpowiednio przyporządkowane wartości do kolejnych liter alfabetu, a czasami zupełnie nowe znaki. 

Jako ciekawostkę warto dodać, że system oparty na liczbie 3 (tak zwany system dziewiątkowy) pojawił się na terenach zamieszkiwanych przez Słowian. Prawdopodobnie zastosowanie akurat takiego systemu wynikało z faktu, że liczba 3 dla Słowian była liczbą magiczną. Współcześnie został on wyparty przez system dziesiętny.

Systemy addytywne i pozycyjne

Zanim przejdziemy do systemu binarnego chciałbym zwrócić uwagę na podział systemów liczbowych. Według systematyki istnieją dwa podstawowe: addytywne i pozycyjne systemy liczbowe.

System pozycyjny składa się z dwóch elementów: zbioru kilku najmniejszych liczb naturalnych oraz podstawy systemu, który może być dowolną liczbą większą niż 1. Określanie wartości odbywa się poprzez mnożenie liczb ze zbioru przez potęgę określaną przez podstawę systemu. Może brzmi troszkę skomplikowanie, ale w istocie jest to bardzo proste. Aby osiągnąć liczbę 321 w systemie dziesiętnym musielibyśmy dokonać następującej operacji:

(3 * 10^2) + (2 * 10^1) + (1 * 10^0) = (3 * 100) + (2 * 10) + (1 * 1) = 321

Systemy pozycyjne towarzyszą nam na codzień. Troszkę inaczej wyglądają systemy addytywne, które oparte są na dodawaniu do siebie wartości kolejnych znaków. Przykładem może być rzymski system liczbowy. Zwróć uwagę, że liczba rzymska MDCCC będzie sumą liczb M, D, C, C i C (odpowiednio 1000, 500, 100, 100 i 100), czyli 1800.

Oprócz wspomnianego systemu dziesiętnego powszechne w użyciu są systemy dwójkowy, ósemkowy i szesnastkowy, co prawda trzy ostatnie najczęściej w informatyce. Każdy z tych systemów jest systemem pozycyjnym.

System dwójkowy

System dwójkowy pojawił się dużo przed powstaniem pierwszego komputera. Za ojca systemu dwójkowego uznaje się Gottfried’a Wilhelm’a Leibniz’a. Leibniz opublikował w 1703 roku artykuł zatytułowany: „Explication de l’Arithmétique Binaire”, gdzie opisał podstawowe założenia systemu. Warto dodać, że system binarny był znany już wcześniej. W XVI wieku używał go John Napier, szkocki matematyk, który w swojej wersji systemu używał liter a i b, zamiast 0 i 1. Jeszcze wcześniej z systemu dwójkowego korzystali starożytni Chińczycy (ok. 1000 lat p.n.e) do ustalania pozycji na kostce do gry i prognozowania pogody.

Leibniz_binary_system_1703.png
System binarny opisany przez Leibniz'a w 1703 roku

System dwójkowy jest oparty na podstawie 2, oznacza to, że do zapisania liczby musimy znać potęgi liczby 2. W zasadzie potęgowanie liczby 2 jest stosunkowo proste - kolejne wartości takiego potęgowania to: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048… itd. 

Jak obliczyć liczbę binarną z dziesiętnej?

Aby zapisać liczbę dziesiętną w systemie dwójkowym musimy wykonać kilka prostych obliczeń. Weźmy na przykład liczbę 14. Operacja, którą będziemy wykonywać to dzielenie z resztą. Liczba całkowita, która powstanie z dzielenia (czyli 7) będzie wykorzystana do dalszych obliczeń, a reszta (0) wskaże nam odpowiednią wartość dla liczby binarnej na kolejnej pozycji. Obliczenia powinniśmy kontynuować, aż dojdziemy do liczby całkowitej 1. Zapisując nasze obliczenia w słupku, czytając od dołu znajdziemy naszą liczbę binarną. Zobacz poniższy przykład:

14 % 2 = 7 reszty 0

7 % 2 = 3 reszty 1

3 % 2 = 1 reszty 1

1 % 2 = 0 reszty 1

14(10) = 1110(2)

W powyższym przykładzie po liczbie 14 w dolnym nawiasie zapisałem 10 - oznacza to liczbę dziesiętną, natomiast dla 1110 dwa, co oznacza liczbę dwójkową. Za pomocą indeksów dolnych możemy zapisywać liczby w różnych systemach liczbowych.

Dwójkowa do binarnej

Spróbujmy odwrócić ten proces. Zgodnie z tym, co wspomniałem wcześniej - liczby binarne oparte są o potęgę liczby 2. Zapiszmy naszą liczbę binarną w słupku i przyporządkujmy poszczególnym jej wartościom kolejne potęgi liczby 2, począwszy od liczby 1. Ostatnia cyfra liczby binarnej powinna mieć przyporządkowaną najmniejszą wartość (1), a pierwsza największą następującą kolejno potęgę liczby 2. Następnie musimy dokonać prostych obliczeń - przemnożyć 0 lub 1 przez przyporządkowaną jej potęgę, a następnie całość zsumować. Zobaczmy przykład:

1 | 8

1 | 4

1 | 2

0 | 1

(1 * 8) + (1 * 4) + (1 * 2) + (0 * 1) = 8 + 4 + 2 + 0 = 14 

Konwersja w JS

Konwersja liczby dziesiętnej na liczbę binarną jest w zasadzie operacją czysto matematyczną, z którą mogą sobie poradzić również języki programowania. W Javascript możemy tę operację wykonać na kilka sposobów, poniżej jeden z nich.

Poczekaj! Przecież metoda toString nie przyjmuje żadnych parametrów, a tutaj nagle przekazaliśmy do niej radix. Radix to nic innego jak liczba z zakresu od 2 do 36, która określa podstawę systemu liczbowego. Domyślnie ta wartość wynosi 10. Rzeczywiście jest też tak, że metoda toString nie przyjmuje parametrów, ale powyższe wywołanie odnosi się do jej implementacji w prototypie Number, gdzie jej działanie delikatnie się różni - np. pozwala na dodanie opcjonalnego parametru, który określi podstawę systemu liczbowego. Aby wykonać operację odwrotną należy oczywiście dopasować odpowiedni radix oraz zapisać liczbę binarną tak, aby JS wiedział, że to liczba binarna. Przyda się nam to tego prefix: 0b.

Świat komputerów

Systemów liczbowych jest bardzo dużo. System dwójkowy nie jest najbardziej intuicyjny, a jednak stanowi podstawę pracy każdego komputera. Dlaczego zatem komputery używają systemu binarnego? 

Odpowiedź jest banalnie prosta. Za pomocą 0 i 1 bardzo łatwo możemy odwzorować jakiś stan lub jego brak, przykładowo w elektronice byłby to brak lub obecność napięcia. Innymi słowy za pomocą 0 i 1 możemy przedstawić cykl, który z punktu widzenia urządzenia na którym pracujemy jest dość istotny. Oczywiście dla użytkownika o wiele ciekawiej byłoby mieć więcej opcji niż tylko dwie, np. dziesięć - wykorzystując cyfry od 0 do 9. Wprowadzenie systemu dziesiętnego do elektroniki wymusiłoby znalezienie 10 różnych sygnałów, które reprezentowałyby poszczególne wartości. Gdyby nawet udało się to zrobić, system taki byłby podatny na zakłócenia, które mogłyby zniekształcać przekaz. Łatwo wyobrazić sobie niewielkie pomyłki, które mogłyby wynikać z problemów infrastrukturalnych, jakimi są chociażby skoki napięcia.

System binarny ma również swoje wady. Nie można za jego pomocą zapisać liczb ujemnych (dla liczb ujemnych odpowiednią część pamięci rezerwujemy na dodatkowy znak), potrzeba dość dużej ilości cyfr do zapisania wartości oraz występuje zjawisko przepełnienia zbioru (czyli stack overflow) oraz niedopełnienia zbioru (under overflow). Pomimo to system ten wydaje się najbardziej pasujący do wymagań maszyn, z którymi pracujemy.

System binarny został wybrany jeszcze z jednego powodu. Bardzo łatwo go zaimplementować na tranzystorze. Tranzystor to element elektroniczny, który został wymyślony w latach 20. XX wieku. Jego zadaniem było wzmocnienie sygnału elektronicznego, czyli zwiększenie jego mocy. Tranzystory zastąpiły wynalezione wcześniej triody i lampy elektronowe - które spełniały te same funkcje, ale były zdecydowanie mniej wydajne. Pochłaniały o wiele większe ilości energii oraz zajmowały dość dużo miejsca (pierwsze komputery lampowe zajmowały całe pomieszczenia). Tranzystory dzięki swoim niewielkim gabarytom podbiły świat - bez nich nie mielibyśmy dziś telefonów komórkowych, komputerów przenośnych i wszelkiej maści przenośnej elektroniki.

Bit

Wiemy już, że komputery mogły się rozwijać dzięki wynalezieniu tranzystorów. Wiemy też, że implementacja systemu binarnego przy wykorzystaniu 0 i 1 (jest sygnał i go nie ma) była dużo łatwiejsza technicznie i mniej ryzykowna niż innych systemów liczbowych. Co zatem komputer robi z tymi liczbami? W zasadzie komputer zapisuje je w pamięci, analizuje, przekształca, tak aby wykonywać zlecone mu zadania (algorytmy). Każde 0 lub 1 to najmniejsza porcja informacji jaką komputer może zapisać w swojej pamięci - określana jako jeden bit. 

Bity grupujemy w bajty (każde 8 bitów to jeden bajt). Zapisanie czegoś wartościowego za pomocą 1 bitu byłoby w zasadzie niemożliwe, ale wprowadzenie zasady 8 bitów (1 bajta) pozwoliło na zapisanie aż 256 różnych znaków. Bajt to nadal mało. Każdy bajt może przechować jedną literę, słowa natomiast zazwyczaj składają się z wielu liter, nie wspominając już o zdaniach. Zaczęto więc dalej grupować. 1 bajt to 8 bitów, 2 bajty 16 bitów, cztery bajty 64 bity… zwróć uwagę, że ilość bajtów rośnie tak jak potęgi liczby 2. 2 do potęgi dziesiątej to 1024, a zatem 1024 bajty to 8192 bity. Przedrostek kilo zwyczajowo oznacza tysiąc, ale w systemie komputerowym nie jesteśmy w stanie osiągnąć takiej liczby, tak aby wypełnić w całości wszystkie dostępne bity. Zastosowano więc skrót myślowy i 1024 bajty oznaczono jako 1 kilobajt. 1024 kilobajty to 1 megabajt, 1024 megabajty to 1 gigabajt, 1024 gigabajty to 1 terabajt, a 1024 terabajty to 1 petabajt. 

Dzisiejsze dyski, na których zapisywane są nasze dane mają już pojemności rzędu kilku terabajtów. Ile zatem 0 i 1 zmieści się na dysku o pojemności jednego terabajta? Dokładnie jest to 8 796 093 000 000 000 000 zer i jedynek (8 tryliardów 796 bilardów 93 biliony). Wydaje się sporo, ale pamiętajmy, że nawet najprostsze zdjęcie potrzebuje nawet kilkudziesięciu milionów bitów, aby zostać zapisane w pamięci komputera.

Stack overflow

Stack overflow to nic innego jak błąd przepełnienia, który pojawia się wtedy, kiedy podczas dokonywania operacji matematycznych na liczbach binarnych powstanie nam liczba z dodatkową cyfrą, która nie pasuje do zarezerwowanej dla wyniku ilości bitów. Problem nie wystąpi, gdy wynik operacji binarnej będzie zawierał tyle samo cyfr, np. 10 + 01 = 10. Jednak gdy dodamy do siebie liczby binarne: 11 i 01, otrzymamy wynik 100. Wynik jak widać to liczba składająca się z 3 cyfr. 

Skutki takiego błędu mogą prowadzić do różnych problemów, takich jak awaria systemu lub nieoczekiwanych wyników - dodatkowa cyfra może zostać zignorowana, a to spowoduje, że z powyższego działania (11 + 01) otrzymamy 3 + 1 = 0. Ups!

O różnych ciekawych błędach związanych między innymi z liczbami binarnymi możesz przeczytać w książce Pi razy oko - Matt'a Parkera.

Warto przeczytać w tym temacie

Pi razy oko - Matt Parker - okładka

Matt Parker

Pi razy oko

Kup

poprzez

TaniaKsiążka.pl

Podsumowanie

Jak widać droga, którą przeszliśmy do programowania była bardzo długa. Na początku musieliśmy nauczyć się liczyć na palcach, odkryć że mamy ich aż 10, aby ostatecznie zauważyć, że system oparty o liczbę dwa może idealnie nadawać się do prognozowania pogody. Przez blisko dwa tysiące lat system binarny czekał na wynalezienie tranzystorów, aby człowiek mógł zbudować maszyny zdolne niesamowicie szybko przetwarzać ogromne ilości danych. 

Gdzie tutaj są nasze języki programowania? Instrukcje pisane w językach kompilowanych (takich jak: C, C++, Pascal) ostatecznie są przetwarzane do zapisu rozumianego przez komputery, czyli do kodu binarnego. W opozycji do języków kompilowanych stoją języki interpretowane, ale to temat na zupełnie inną historię.

Udostępnij ten artykuł:

Komentarze (0)

    Jeszcze nikt nic nie napisał, ale to znaczy że... możesz być pierwszy/pierwsza.

Powiązane treści

Jeżeli ten artykuł Cię zainteresował sprawdź inne materiały powiązane z nim tematycznie. Poniżej znajdziesz artykuły i odcinki podcastów mojego autorstwa oraz polecane przeze mnie książki, które rozszerzają ten temat.

Matematyka by dra_schwartz
Artykuł
01 lipca 2022

O liczbie NaN

O liczbach w programowaniu nie można nie rozmawiać. W szczególności o tak ważnej liczbie jaką jest NaN. W ramach tego artykułu postaram się przyjrzeć matematyce, liczbom, koncepcji NaN i jej działaniu w świecie kodu.

Czytaj więcej
Prawdziwa historia JSONa by Aleksandr Korchagin
Artykuł
10 lutego 2022

Prawdziwa historia JSONa

HRejterzy w jednym w swoich filmów obarczyli winą, za problem w projekcie, JSONa. Zakładając, że to on jest winny tak wielu błędów w projektach IT - może warto go lepiej poznać. Poznajcie prawdziwą historię JSONa.

Czytaj więcej

Zapisz się do newslettera

Bądź na bieżąco z nowymi materiałami, ćwiczeniami i ciekawostkami ze świata IT. Dołącz do mnie.