Bity, bajty i nybble, ojej!
Najmniejszą informacją, którą można przechowywać i manipulować w maszynie cyfrowej, jest cyfra binarna (inaczej „bit”), która może być używana do ucieleśnienia dwóch wartości. Zazwyczaj myślimy o tych wartościach jako reprezentujących liczby 0 i 1. Jak omówiliśmy wcześniej, zakładając, że pracujemy z mikrokontrolerem w środowisku Arduino, te wartości 0 i 1 są równoważne odpowiednio LOW i HIGH, gdy pracujemy (odczytujemy lub zapisujemy) na cyfrowych wejściach/wyjściach (I/O). Są one również równoważne odpowiednio false i true, jeśli traktujemy je jako logiczne wartości logiczne.
Ponieważ pojedynczy bit jest ograniczony pod względem ilości informacji, które może reprezentować, zwykle wygodniej jest pracować z grupami bitów. Niektóre grupy są powszechne, więc nadaliśmy im specjalne nazwy. Na przykład termin „bajt” odnosi się do grupy 8-bitowej, podczas gdy termin „nybble” (lub „nibble” – wolę „nybble”!) odnosi się do grupy 4-bitowej. Oznacza to, że dwa nybble tworzą bajt, co pokazuje, że inżynierowie komputerowi mają poczucie humoru, choć nie jest ono zbyt wyrafinowane.
Ogólnie rzecz biorąc, ludziom trudno jest ogarnąć umysłem duże liczby przedstawione w postaci binarnej. Na przykład, 10101100 w systemie binarnym nie ma większego znaczenia dla większości ludzi, podczas gdy jego dziesiętny odpowiednik 172 jest łatwiejszy do zrozumienia.
Binarny system liczbowy ma dwie cyfry, 0 i 1. Dziesiętny system liczbowy ma 10 cyfr, 0, 1, 2, 3, 4, 5, 6, 7, 8 i 9. Z powodów, które zostaną wyjaśnione w przyszłych odcinkach, mapowanie (tłumaczenie) wartości tam i z powrotem między systemem binarnym i dziesiętnym nie jest tak wygodne, jak można by się spodziewać. Znacznie bardziej efektywne jest użycie szesnastkowego systemu liczbowego, który składa się z 16 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E i F. Piękno tego systemu polega na tym, że każda cyfra szesnastkowa jest bezpośrednio odwzorowywana na 4-bitową cyfrę binarną.
W poprzednich odcinkach omówiliśmy różnicę między liczbami całkowitymi ze znakiem i bez znaku. Również fakt, że w przypadku typu danych int (integer) jego rozmiar – tj. liczba bitów użytych do jego reprezentacji – zależy od komputera lub środowiska na którym pracujesz. Na przykład w przypadku Arduino Uno, int zajmuje dwa bajty (16 bitów) pamięci.
Załóżmy, że deklarujemy liczbę int o nazwie intA. Załóżmy ponadto, że przypiszemy mu wartość 0xCA35, gdzie przedrostek „0x” wskazuje, że jest to wartość szesnastkowa:
Bramki AND i OR
Na najniższym poziomie komputer cyfrowy składa się z ogromnej liczby kluczy przełączających. Przełączniki te mogą być implementowane przy użyciu różnych technologii, w tym mechanicznych, elektromechanicznych (przekaźniki), pneumatycznych i półprzewodnikowych (tranzystory). W dzisiejszych czasach, oczywiście, tranzystory są w modzie – i to właśnie założymy tutaj – ale kto wie, co nadejdzie jutro?
Kolejnym poziomem jest gromadzenie małych grup tranzystorów i wykorzystywanie ich do implementacji prostych funkcji logicznych – zwanych prymitywnymi bramkami logicznymi – a następnie łączenie tych bramek ze sobą w sprytny sposób. Dwie bramki, na których skupimy się w tym artykule, to bramki AND i OR.
Zauważ, że używamy znaku & do reprezentowania AND, podczas gdy znak | jest używany do reprezentowania OR. Jak widzimy, wyjście (y) z bramki AND ma wartość 1 tylko wtedy, gdy oba jej wejścia (a i b) mają wartość 1; w przeciwnym razie wyjście ma wartość 0. Dla porównania, wyjście bramki OR ma wartość 1, jeśli którekolwiek z jej wejść ma wartość 1.