O dwójkowym systemie liczbowym będzie. Krótko, zwięźle, a nawet na temat! Jeśli hieroglify pokroju „0111001101101001011001010110110101100001” nic Ci nie mówią, to nie masz czego tu szukać… Zamiast szukania weź się po prostu za czytanie tego wpisu. Powinien Ci wszystko rozjaśnić. Do dzieła!

01001110… Oh wait! Na co to komu?!

Pierwsze skojarzenie, jakie Ci się nasuwa, to wodospady zerojedynkowych ciągów spływające po ekranie, przed którym zasiada szalony informatyk, chcący przy pomocy z lekka zakurzonej klawiatury przejąć władzę nad światem? No, coś w ten deseń. Do komunikacji z komputerem raczej nikt nie używa bezpośrednio samych zer i jedynek, faktem jest jednak, że w dzisiejszym cyfrowym świecie poszczególne układy elektroniczne „rozmawiają ze sobą” w ten właśnie sposób. 0 i 1. Stan niski i stan wysoki. Taka najmniejsza jednostka informacji to po prostu „bit”. Jeden bit przenosi informację typu 1 lub 0, tak lub nie, prawda i fałsz. I tyle.

Jak to działa? Wyobraź sobie jakiś prosty układ scalony, np. mikrokontroler, który operuje napięciami z zakresu od 0V do 5V. Nie utrudniajmy sobie życia, niech stan niski będzie zerem, a stan wysoki – jedynką. To co, 0V będzie stanem niskim, a jeśli napięcie będzie wyższe, to będziemy mieli jedynkę, czyli stan wysoki? No nie do końca 😀

Jeśli założylibyśmy sobie coś takiego:

STAN NISKI —> 0.000…000V

STAN WYSOKI —> 0.000…0001V do 5V

…to byłoby niewesoło. Może nikt by nie płakał, ale odróżnienie wartości 0.000000V od 0.000001V byłoby dosyć karkołomnym zadaniem, nie sądzisz? Jak możemy zmodyfikować powyższe rozwiązanie, by żyło się lepiej?

Sensowne byłoby ustalenie jakichś zakresów, wiesz stan niski będzie od 0V do 2.5V, a od 2.5V do 5V będzie stan wysoki. Brzmi już lepiej. Choć nie do końca… Przyjrzyj się uważnie:

STAN NISKI —> od 0V od 2.5V

STAN WYSOKI —> od 2.5V od 5V

Teraz pytanie za 100 lajków! Jaki stan będzie, jeśli jedna nóżka mikrokontrolera zagada do drugiej napięciem równym 2.5V? Hm, nieustalony? No, można tak powiedzieć. Rozwiązaniem tegoż palącego problemu będzie wrzucenie pomiędzy stan niski i wysoki jeszcze jednego stanu, powiedzmy „przejściowego”.

STAN NISKI —> od 0.00V do 1.80V

STAN PRZEJŚCIOWY —> od 1.81V do 3.19V

STAN WYSOKI —> od 3.20V do 5.00V

Prawda, że lepiej? Stan, który nazwaliśmy sobie przejściowym, będzie interpretowany jako „nic”. Ani zero, ani jeden. Tak będzie lepiej, prościej, schludniej i cudniej. Mam nadzieję, że zrozumiałeś. Jeśli coś jest niejasne, napisz w komentarzu. Wiem, że w notach katalogowych różnych układów znajdziesz inne wartości, ale chodzi mi po prostu żebyś intuicyjnie „czuł”, o co chodzi.

System binarny, dwójkowy, a może zero-jedynkowy?

Szczerze, nie musisz się przejmować zbytnio nazewnictwem. Każdy powinien zrozumieć, o co Ci chodzi. To tak jak z cukrem waniliowym. A może wanilinowym? Jakim?! Hm, poczekaj…

Ta straszna matematyka, czyli z dwójkowego na dziesiętny i z powrotem

Abstrahując od tematu cukru wanilinowego, warto wiedzieć jak wygląda ta sama liczba w systemie dwójkowym i dziesiętnym. Przyda Ci się podstawowa znajomość matematyki. W sumie to mnożenia. No i dodawania. O potęgowaniu nawet nie wspominam (choć właśnie to zrobiłem).

Najpierw weźmy jakąś liczbę zapisaną w systemie dwójkowym, niech to będzie 1011. Od czego zacząć? Od początku!

$\rm{1011=1\cdot 2^{3}+0\cdot 2^{2}+1\cdot 2^{1}+1\cdot 2^{0}}$

Przeliczając daną liczbę z systemu dwójkowego na dziesiętny najlepiej zacząć od prawej strony. Ważne, by pamiętać, że pierwsza cyfra od prawej będzie mnożona przez dwa do potęgi zero, czyli $\rm{2^{0}}$… Ile to jest? Ano jeden i właściwie każda liczba podniesiona do zerowej potęgi równa się jeden. Tak już jest. Pogódź się z tym.

Krótko mówiąc: $\rm{2^{0}=1}$ 🙂

Mamy liczbę zapisaną jako 1011, a więc – idąc od prawej strony – mamy 1, 1, 0, i 1. Rozumiesz?

Idziemy w lewo, każdą następną cyfrę zapisu dwójkowego mnożymy przez „dwa do potęgi…”. Do potęgi jakiej? Jak widzisz na wcześniejszym równaniu, do potęgi „o jeden większej”. Pamiętaj o kolejności wykonywania działań, najpierw będziemy potęgować…

$\rm{1011=1\cdot 2^{3}+0\cdot 2^{2}+1\cdot 2^{1}+1\cdot 2^{0}}$

…i mnożyć…

$\rm{1011=1\cdot 8+0\cdot 4+1\cdot 2+1\cdot 1}$

…potem dodawać poszczególne elementy układanki…

$\rm{1011=8+0+2+1=11}$

Voilà! To wszystko. Wiem, że może to być dla Ciebie w tej chwili niejasne, ale spróbuj przeanalizować sobie to po kolei, jeszcze raz. Jak czegoś nie rozumiesz, pisz w komentarzu. Ku chwale królowej nauk, albo chociaż dla przećwiczenia podam Ci kilka gotowych rozwiązań, nad którymi możesz przysiąść i wytężyć swój umysł. Polecam!

0000 1101 = 13
0001 0011 = 19
0010 1010 = 42
1110 0011 = 227
1011 1010 = 186

Baw się dobrze!

Dobra, to może teraz odbijemy piłeczkę w drugą stronę? Tzn. przeliczymy liczbę podaną w systemie dziesiętnym na system dwójkowy. Niech to będzie 121, słownie „sto dwadzieścia jeden”. Wiesz, jakbyś jedenaście pomnożył przez… jedenaście.

Pewnie już zauważyłeś, że w systemie dwójkowym operujemy na potęgach dwójki: $\rm{2^{0}}$, $\rm{2^{1}}$, $\rm{2^{2}}$, $\rm{2^{3}}$, $\rm{2^{4}}$, etc. No i właśnie te potężne potęgi będą nam w tej chwili potrzebne. Najpierw zastanów się, jaka największa potęga liczby dwa „mieści się” w interesującej nas 121.

(chwila na zastanowienie…)

Już wiesz? Nie? No dobra, pomogę Ci. Zaczniemy od początku, czyli od $\rm{2^{0}}$. $\rm{2^{0}}$ równe jest jeden. Owszem, jeden mieści się w 121. Ba! Nawet 121 razy 😀 Ale my szukamy największej potęgi, jaka mieści się w 121, czyli bawimy się dalej. $\rm{2^{1}}$? Za mało. $\rm{2^{4}}$? To 16, też nie to. Dwa do piątej? 32. Dwa do szóstej? 64. Sporo. To już? Zróbmy jeszcze jeden krok – ile jest $\rm{2^{7}}$? No… Ciut za dużo, bo równo 128.

Ok, wiemy już zatem, że największą potęgą dwójki „mieszczącą się” w liczbie 121 jest $\rm{2^{6}}$, czyli 64. Co nam to daje? Przede wszystkim wiemy ile będziemy mieli cyfr (zer lub jedynek) w zapisie dwójkowym. Będzie ich 6+1, czyli 7. Skąd ta dodatkowa cyfra? Jeśli przypomnisz sobie, w jaki sposób przeliczaliśmy liczbę zapisaną w systemie dwójkowym na system dziesiętny, to zauważysz, że zaczynaliśmy od $\rm{2^{0}}$. Ot, cała filozofia.

Wracając do sedna. Wiemy, że będziemy mieli 7 cyfr. Co wiemy jeszcze? Najbardziej znacząca cyfra (ta najbardziej z lewej) będzie jedynką. Dlaczego? $\rm{2^{6}}$ mieści się w 121, zatem…

$121=1\cdot \rm{2^{6}}+…$

…w zapisie dwójkowym 121 = 1______

(poczekaj, zaraz zrozumiesz)

No dobrze, a co z pozostałymi sześcioma cyframi? Sytuacja jest analogiczna, rzec można opieramy się o ten sam algorytm. Sprawdzamy teraz czy kolejna, mniejsza potęga dwójki ($\rm{2^{5}}$) zmieści się w $\rm{121-2^{6}}$, czyli $\rm{121-64}$, czyli $\rm{57}$. Podsumowując – czy 32 mieści się w 57? Tak. No to dokładamy kolejną jedynkę do naszej listy…

$\rm{121=1\cdot 2^{6}+1\cdot 2^{5}…}$

…w zapisie dwójkowym 121 = 11_____

Wiesz już jak to pchnąć dalej? Teraz sprawdzamy czy $\rm{2^{4}}$ zmieści się w $\rm{57-2^{5}=57-32=25}$. W skrócie – czy 16 mieści się w 25? Tak, hurra! Mamy kolejną jedynkę w dwójkowym zapisie liczby 121.

$\rm{121=1\cdot 2^{6}+1\cdot 2^{5}+1 \cdot 2^{4}…}$

…w zapisie dwójkowym 121 = 111____

No to jeszcze tylko 3, 2, 1, 0… Ale zanim skończymy, sprawdźmy czy kolejna „mniejsza o jeden” potęga dwójki nam pasuje. Innymi słowy czy $\rm{2^{3}}$ zmieści się w $\rm{25-2^{4}=25-16=9}$. Bez owijania w bawełnę – czy 8 zmieści się w 9? Znowu odpowiedź brzmi twierdząco. Kolejna jedynka.

$\rm{121=1\cdot 2^{6}+1\cdot 2^{5}+1 \cdot 2^{4}+1\cdot 2^{3}…}$

…w zapisie dwójkowym 121 = 1111___

Pozostaje Ci jeszcze sprawdzić $\rm{2^{2}}$, $\rm{2^{1}}$ i $\rm{2^{0}}$. Wierzę, że dasz radę! Podpowiem tylko, że 121 w zapisie dwójkowym prezentuje się w ten oto zacny sposób: 1111001. Prawda, że pięknie? No, to do dzieła 🙂

Jakieś wątpliwości? Opisz je w komentarzu pod tym wpisem.

Może tak heksadecymalnie, do kawy?

Oprócz opisywanego tutaj dwójkowego i używanego przez zwykłych śmiertelników dziesiętnego, istnieją jeszcze inne systemy liczbowe. Jednym z nich jest system szesnastkowy, zwany również systemem heksadecymalnym.

Podstawą tego systemu jest liczba 16, do dyspozycji mamy dokładnie 16 „cyfr”, a właściwie znaków, czyli…

0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F

Podpowiem, że litery od A do F, to po prostu odpowiedniki kolejnych liczb, jakie wystąpiłyby po cyfrze dziewięć.

A = 10

B = 11

C = 12

D = 13

E = 14

F = 15

Rozumiesz?

W jaki sposób poruszać się w tym gąszczu cyfr i liter? Nie jest tak strasznie, jak mogłoby się wydawać. Najpierw pokażę na przykładzie, jak z systemu dziesiętnego przenieść się do systemu szesnastkowego. Następnie nieco podniesiemy poprzeczkę, zobaczysz jak w prosty sposób przenieść się z systemu dwójkowego do… Heksadecymalnego, rzecz jasna. Na koniec będzie mała zagadka…

Heksa… decymalnie?

Jak już wcześniej wspomniałem pokażę Ci jak przeliczyć liczbę zapisaną w systemie… No właśnie. W systemie dziesiętnym, czyli decymalnym, na liczbę w systemie heksadecymalnym. Takie tam zawiłości.

Na warsztat bierzemy sobie liczbę 60. Pierwszym krokiem do celu, czyli do „zapisu hex” będzie podzielenie liczby 60 przez…

 

 

 

 

 

 

 

 

 

 

 

(uwaga, uwaga, chwila do namysłu…)

 

 

 

 

 

 

 

 

 

 

 

Przez podstawę systemu heksadecymalnego, innymi słowy przez liczbę 16. 😀

$\rm{60:16=3.75}$

Super! Prawie o to nam chodziło. Prawie. Istotnym faktem będzie ile razy w danej liczbie (w naszym przypadku – ile razy w liczbie 60) mieści się 16. Chodzi o całości. Jak widać mamy trzy „całe szesnastki”. Pamiętasz może ze szkoły tzw. „dzielenie z resztą”? Dokładnie o tego typu operację tu chodzi.

W praktyce bardziej interesuje nas taki zapis…

$\rm{60:16=3 \cdot 16 + 12}$

…a jeszcze bardziej taki…

$\rm{60:16=3\ r12}$

…lub coś podobnego. Widzimy, że wynikiem dzielenia są 3 całości i reszta równa 12. Tyle potrzebujemy, by zapisać liczbę 60 w systemie szesnastkowym. Odpowiednikiem cyfry 3 w zapisie heksadecymalnym jest… po prostu 3, natomiast odpowiednikiem 12 jest litera C. Podsumowując, 60 w zapisie dziesiętnym, to 3C w zapisie szesnastkowym.

Cała filozofia to jedno proste działanie – dzielenie. Bierzesz interesującą Cię liczbę, dzielisz przez 16 i sprawdzasz ile jest „całości” w tejże liczbie i ile jest „reszty”. Wsio.

Było nas dwóch, miało być szesnastu…

…i będzie! Jest na to prosta i jakże skuteczna metoda.

Bierzemy sobie jakąś liczbę w zapisie dwójkowym, np. 00101011. W zapisie dziesiętnym to będzie 43. A w zapisie „hex”? Zacznijmy od początku.

  1. Mamy naszą liczbę: 00101011.
  2. Ułatwimy sobie sprawę robiąc małą, kosmetyczną wręcz poprawkę… Wstawiając spację, dzieląc liczbę na dwie grupy (po cztery cyfry). W ten sposób: 0010 1011.
  3. Teraz wystarczy wiedzieć… Jak przeliczyć liczbę binarną na liczbę w zapisie dziesiętnym. Już wiesz? No to super.
  4. Przeliczamy każdą z „grup” na system dziesiętny.
  5. Pierwsza grupa: 0010 = 2.
  6. Druga grupa: 1011 = 11.
  7. Co dalej? Zamieniamy 2 i 11 na zapis szesnastkowy. Mamy zatem 2 = 2 oraz 11 = B.
  8. Podsumowując, 00101011 w zapisie heksadecymalnym to po prostu 2B. Prawda, że ładnie?

Hm… To już wszystko? Byłbym zapomniał! Wspominałem o małej zagadce. Na koniec. Jak już pewnie zdążyłeś zauważyć, pokazałem jak przeliczać liczbę zapisaną w systemie decymalnym lub binarnym na system heksadecymalny. Super, a jakby tak „w drugą stronę”? Jak zapis szesnastkowy zmienić w dwójkowy, albo po prostu dziesiętny? To nic trudnego! Zastanów się, jak to zrobić, a swoimi przemyśleniami podziel się w komentarzach pod artykułem.

Wierzę, że Ci się uda!

Podsumowanie

Dobrnęliśmy do końca! Podobało się? Masz jakieś uwagi, sugestie, pytania, cokolwiek? Pisz w komentarzu pod artykułem. Jednocześnie zachęcam Cię do śledzenia profilu elektroniczny.eu na Facebooku. Warto.

 

Zdjęcie: Christopher Neugebauer / Foter / CC BY-SA