W dyskusji przy ostatniej notce SławekP zapytał mnie, dlaczego faworyzuję system binarny, składający się tylko z cyfr 0 i 1. Zrobiłem to, ponieważ w tym systemie działają wszystkie komputery działające w architekturze von Neumana (współczesne pecety), w których pamięć składa się z ciągów zer i jedynek, które są potem odczytywane jako liczby (dziesiętne czy szesnastkowe.
- W systemie dziesiętnym, cyfry mogą przyjmować wartości: 0,1,2,3,4,5,6,7,8,9.
- W systemie dwójkowym, cyfry mogą przyjmować wartości: 0,1
W systemie dziesiętnym, kolejne liczby tworzy się podczas dodawanie kolejnych cyfr z kolejnymi potęgami dziesięciu, przykłady:
- 12 = 1 * 10^1 + 2 * 10^0 = 1 * 10 + 2 = 10 + 2
- 54 = 5 * 10^1 + 4 * 10^0 = 5 * 10 + 4 = 50 + 4
W systemie binarnym jest podobnie, ale tutaj podstawą systemu jest liczba cyfr równa 2:
- 10 = 1 * 2^1 + 0 * 2^0 = 1 * 2 + 0 = 2 + 0 = 2
- 1010 = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 = 8 + 2 = 10
Jeszcze do dzisiaj, mimo że nie używam już tak intensywnie jak kiedyś, mogę z pamięci wyrecytować kolejne potęgi dwójki, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536...
Jako 17-letnie dziecko, jeszcze w czasach komputerów ośmiobitowych lubiłem grzebać w kodzie gier, aby sprawdzać "co się stanie gdy". Sprowadzało się to tak naprawdę do poszukiwania nieśmiertelności w grach. Kilka razy nawet wydrukowano wynik moich eksperymentów w magazynie Top Secret, z czego jakże byłem wtedy dumny. Programy miały maksymalnie 64kB (= 64 * 1024 bajty= 64 * 1024 * 8 bitów), a większość nawet po 16kB. Można je było łatwo ogarnąć rozumem. Nawet lista rozkazów procesora Z80 mieściła się na jednej kartce.
Przykładowo LD A, * oznaczał: załaduj (LoaD) liczbę zapisaną w kolejnym bajcie do akumulatora, czy inaczej rejestru A (rejestr to zmienna przechowywana bezpośrednio w procesorze). Oczywiście w pamięci komputera nie było symbolicznych napisów typu LD A, 2, a zamiast tego miałem doczynienia z ciągiem cyfr binarnych. LD A, 2 to inaczej 11111110 (rozkaz LD A, *) 00000010 (liczba 2).
Zmieniając teraz liczbę w kolejnym bajcie i uruchamiając grę, można było obserwować np. mniejszą liczbę śmiercionośnych obiektów na ekranie :) Znajdowanie nieśmiertelności najczęściej sprowadzało się do poszukiwania jednego z rozkazów DEC (DECrement, zmniejsz rejestr o 1) lub INC (INCrement, zwiększ rejestr o 1) i zamiany go na NOP (No OPeration, nic nie rób), dzięki czemu liczba żyć naszego bohatera nie była odejmowana.
W szczególnych przypadkach, zmiana jednego bitu w całej pamięci (całym "świecie", w którym działał program) mogła zdecydować o nieśmiertelności, np. ADD A, 1 (11000110 00000001) - dodaj jeden do akumulatora, zmienione na ADD A, 0 (11000110 00000000) - dodaj 0 do akumulatora powodowało utrzymanie status quo w grze. Podczas przypominania sobie rozkazów posiłkowałem się opracowaniem dostępnym tutaj.
Zwracam uwagę, że w przypadku komputera system dziesiętny się nie sprawdza, bo np. największą liczbą zapisaną w bajcie, najmniejszej komórce pamięci złożonej z ośmiu bitów jest ni przypiął ni przyłatał 255. Co z tym fantem zrobić? Może do komunikacji pomiędzy informatykami system 256-tkowy? Wymagałby on aż 256 symboli dla każdej cyfry, a jako że my chińczykami nie jesteśmy, zdecydowano się podzielić bajt na dwie liczby 16 * 16 = 256. Tak powstał system szesnastkowy, składający się z cyfr 0,1,2,3,4,5,6,7,8,9,A (10), B (11), C (12), D (13), E (14), F (15). Od tej pory zamiast 11110000 można powiedzieć F0, a chyba każdy rasowy informatyk będzie wiedział co to za liczba.
Niezależnie od tego jakim systemem byśmy się nie porozumiewali, każdą liczbę można sprowadzić do systemu dwójkowego. Pojedynczy bit, przyjmujący wartości 0 albo 1 jest najmniejszą porcją informacji. Zmiana wartości bitu z zera na jeden lub odwrotnie następuje w komputerach programowo (nikt nie wchodzi do procesora i nie przestawia jakichś tajemnych zworek. Innymi słowy program "nie widzi" fizycznej maszynerii procesora, takiej jak zasilacz czy wiatraczek przy procesorze. Program operuje na bitach.
Szukając nieśmiertelności w grach uruchamiałem jeden program, by zmienił strukturę bitów drugiego programu. W kolejnej notce odniosę się do wykładu VI Stanisława Hellera, a na zakończenie rysunek złożony z coraz większej liczby bitów.
Komentarze