Číselné soustavy
Na světě existuje 10 typů lidí: Ti, kteří rozumí binární soustavě, a ti, kteří ne.
Pravděpodobně jste tenhle vtip už někde slyšeli nebo viděli na tričku. Možná vám tehdy nedával smysl, ale věřte, že za pár hodin se mu budete smát taky. Dnes totiž opustíme náš bezpečný lidský svět, kde všechno počítáme na prsty, a podíváme se na to, jak realitu vnímá a počítá hardware uvnitř počítače.
Proč se musíme učit znovu počítat?
My lidé máme deset prstů, a proto už od školky přirozeně používáme desítkovou (dekadickou) soustavu. Máme cifry od 0 do 9, a když nám dojdou, skočíme o řád výš na desítky, stovky a tisíce.
Jenže procesor prsty nemá. Jak jsme si říkali u architektury počítače, ALU (aritmeticko-logická jednotka) je složená z milionů mikroskopických tranzistorů. A tranzistor umí jen dvě věci – být bez proudu (0), nebo pod proudem (1). Nic mezi tím neexistuje. Počítač je vlastně neuvěřitelně rychlý hlupák, který zná jen dvě čísla. Všechno, co na počítači děláte – od psaní kódu ve Visual Studio Code přes programování ve Visual Studiu až po ukládání dat do MariaDB – jsou pro procesor jen miliardy nul a jedniček.
V této kapitole se zaměříme na:
- dvojkovou (binární) soustavu: Základní stavební kámen IT. Ukážeme si, jak z obyčejných nul a jedniček poskládat jakékoliv číslo a jak tato čísla převádět do naší desítkové soustavy a zase zpátky.
- šestnáctkovou (hexadecimální) soustavu: Protože psát tisíce nul a jedniček za sebou je pro lidi za trest, vymysleli jsme si zkratku. Šestnáctkovou soustavu potkáte v IT na každém kroku – ať už budete v CSS nastavovat barvy (např.
#FF0000pro červenou), nebo sledovat, na jaké adrese v paměti RAM zrovna visí vaše proměnná v Céčku. - osmičkovou (oktalovou) soustavu: Menší sestru šestnáctkové soustavy, která se sice dnes nepoužívá tak často, ale má své pevné místo třeba při nastavování přístupových práv v Linuxu.
- počítání bez desítek: Vrátíme se na chvíli na první stupeň základní školy a budeme sčítat, odečítat a jednoduše násobit pod sebou. Jen s tím rozdílem, že místo desítkové soustavy to budeme dělat přímo v bináru nebo hexu. Uvidíte, že pravidla jsou úplně stejná, jen si na ně musíte zvyknout.
Desítková (dekadická) soustava
Desítková soustava používá deset různých cifer:
Jestliže jsme již dosáhli 9 a chceme připočíst jedna, z devítky se stane opět nula, a cifra před devítkou se o jedna zvedne:
9 + 1 = 10
resp.
19 + 1 = 20
Dvojková (binární) soustava
Dvojková soustava používá pouze dvě cifry:
Nula nám reprezentuje stav, kdy tudy proud neteče; jednička stav, kdy proud teče.
Přičítání děláme úplně stejně jako v desítkové soustavě, jenom máme k dispozici pouze 0 a 1. Chceme-li tedy sečíst 1 a 1, vyjde nám:
1 + 1 = 10
To je jasné – stejně jako se v desítkové soustavě z devítky stala nula, i tady se z jedničky stala nula. A stejně jako v desítkové soustavě se cifra před jedničkou zvedla o jedna.
Stejně můžeme postupovat například takto:
10 + 1 = 11
11 + 1 = 100
100 + 10 = 110
100 + 11 = 111
110 + 1 = 111
111 + 1 = 1000
Vyzkoušejte si přičítání / odečítání jedniček v dekadické a binární soustavě na zkušební stránce dekadické a binární soustavy.
Převod z dekadické do binární soustavy
Nyní se zaměříme na postup, jak převést číslo ze soustavy, ve které počítáme my do soustavy, ve které počítá počítač. K tomu si musíme nadefinovat operaci modulus, čili zbytek po celočíselném dělení.
Představme si, že potřebujeme spočítat 8 děleno 2. To je jednoduché – výsledek je 4 a nic nám nezbylo. 8 modulo 2 je tedy 0.
Horší to ale je, když dvojkou chceme dělit liché číslo. Například 9 děleno 2. Výsledek je opět 4 (říkali jsme celočíselné dělení), ale zbyla nám jednička – ta už se totiž dvojkou (celočíselně) dělit nedá. 9 modulo 2 je tedy 1. Pro modulus budeme používat znak %.
4 % 2 = 0
5 % 2 = 1
6 % 2 = 0
7 % 2 = 1
8 % 2 = 0
9 % 2 = 1
Vidíme tedy, že výsledek operace modulo dvěma nemůže vyjít jinak než 0 nebo 1 – 0 nám vyjde, pokud počítáme se sudým číslem a 1 nám vyjde, počítáme-li s číslem lichým.
Nyní tedy k samotnému postupu – vezmeme si převáděné číslo a budeme jej dělit dvěma. Zároveň si budeme psát i výsledek modulo operace. Celý postup budeme opakovat s tím, že výsledek si napíšeme znovu jako převáděné číslo. Skončíme až v okamžiku, kdy výsledek se rovná nule.
| Číslo | Operace | Výsledek | Modulus |
|---|---|---|---|
| 70 | / 2 = | 35 | 0 |
| 35 | / 2 = | 17 | 1 |
| 17 | / 2 = | 8 | 1 |
| 8 | / 2 = | 4 | 0 |
| 4 | / 2 = | 2 | 0 |
| 2 | / 2 = | 1 | 0 |
| 1 | / 2 = | 0 | 1 |
Nyní sepíšeme sloupec „modulus“ odspoda nahoru a máme číslo v binární soustavě.
(70)10 = (1000110)2
Převod z binární do dekadické soustavy
V této části si představíme situaci, kdy se setkáme s binárním číslem, ale chceme jej pochopit v naší číselné soustavě, ve které počítáme od první třídy. Ještě než začneme, zopakujeme si mocniny čísla 2 (převádíme z dvojkové soustavy):
20 = 1
21 = 2
22 = 4
23 = 8
24 = 16
25 = 32
26 = 64
27 = 128
28 = 256
Tyto mocniny jako ajťáci budeme znát zpaměti.
Nyní si prostě rozložíme binární číslo na jednotlivé cifry a vynásobíme je mocninou dvojky, výsledek pak sečteme:
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | |
| * 26 | * 25 | * 24 | * 23 | * 22 | * 21 | * 20 | |
| 64 | 0 | 0 | 0 | 4 | 2 | 0 | = 70 |
Hexadecimální (šestnáctková) soustava
Význam binární (dvojkové) soustavy jsme si již vysvětlili – přesně tak počítač pracuje i ukládá data. Protože ale zobrazovat data v binární soustavě by bylo příliš náročné na místo, používáme k zobrazování hexadecimální (šestnáctkovou) nebo oktalovou (osmičkovou) soustavu. Kouzlo těchto soustav spočívá v tom, že se velmi jednoduše převádějí s binární soustavou – používáme vždy čtveřice, resp. trojice cifer v binární soustavě, které tvoří jeden znak v hexadecimální, resp. oktalové soustavě.
Představme si například fyzickou adresu (MAC adresu), která je standardně zapisovaná v hexadecimální soustavě:
28:CF:E9:D6:09:CC
V binární soustavě by taková jedna adresa vypadala:
00101000:11001111:11101001:11010110:00001001:11001100
Vidíme, že práce s adresou v hexadecimální soustavě je mnohem komfortnější a také méně náchylná na chybu.
Pojďme tedy na detaily hexadecimální soustavy – stejně jako dekadická soustava používá 10 znaků pro jednu cifru a binární soustava pouze 2 znaky pro jednu cifru, hexadecimální soustava jich používá 16:
Protože klasických znaků pro číslice skutečně máme pouze 10, pro další znaky jsme si vypomohli prvními šesti písmeny abecedy. Platí tedy například, že:
(9)16 + (1)16 = (A)16
(9)16 + (2)16 = (B)16
(9)16 + (3)16 = (C)16
(9)16 + (4)16 = (D)16
(9)16 + (5)16 = (E)16
(9)16 + (6)16 = (F)16
A stejně jako při počítání v předchozích soustavách, jakmile narazíme na poslední znak, a potřebujeme přidat jedničku, nahradíme tento nulou a předchozí cifru o jedna zvýšíme:
(9)16 + (7)16 = (10)16
Pozor tedy na nástrahy počítání v hexadecimální soustavě:
(5)16 + (5)16 = (A)16 //tedy nikoliv 10! (tak by to bylo v dekadické soustavě)
(10)16 - (5)16 = (B)16 //tedy nikoliv 5! (tak by to bylo v dekadické soustavě)
Vyzkoušejte si přičítání / odčítání jedniček v hexadecimální soustavě na zkušební stránce dekadické a hexadecimální soustavy.
Převod mezi binární a hexadecimální soustavou
Jak už jsme psali výše, převod mezi binární a hexadecimální soustavou je velmi prostý – číslo v binární soustavě si rozdělíme na čtveřice (odzadu) a ty prostě převedeme na čísla v hexadecimální soustavě. Použít můžeme buďto převodní tabulku, nebo si jednoduše 16 kombinací v binární soustavě zapamatujeme:
| Hexadecimální soustava | Binární soustava |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
| A | 1010 |
| B | 1011 |
| C | 1100 |
| D | 1101 |
| E | 1110 |
| F | 1111 |
Máme-li tedy v binární soustavě číslo 11001010, rozdělíme si jej na čtveřice 1100 a 1010 a ty převedeme na C a A. Můžeme tedy napsat, že:
(11001010)2 = (CA)16
Pokud nebude počet cifer v binární soustavě dělitelný čtyřmi, jednoduše si představíme vpředu nuly:
(11010)2 = (1A)16
Čtveřice cifer zezadu 1010 je v hexadecimální soustavě cifra A, a zbyla pouze 1. 1 je 1 jak v binární, tak v hexadecimální soustavě.
Převod z hexadecimální soustavy na binární je stejně jednoduchý – použijeme buďto převodní tabulku výše, nebo si čísla jednoduše zapamatujeme:
(4CA)16 = (0100 1100 1010)2 //pro lepší názornost uvádím s mezerami mezi
(F1)16 = (111 0001)2 //pro lepší názornost uvádím s mezerami mezi
Oktalová (osmičková) soustava
Oktalová soustava na rozdíl od hexadecimální soustavy používá pouze osm znaků pro jednu cifru. Důvodem je, aby šlo převádět binární soustavu po trojicích (nikoliv po čtveřicích jako v hexadecimální soustavě). Používáme tedy pouze znaky:
Tedy znaky 8 a 9, které známe z dekadické soustavy, zde úplně vypouštíme. Platí tedy například, že:
(7)8 + (1)8 = (10)8 //nikoliv 8 – protože tento znak v oktalové soustavě není!
Pozor tedy na nástrahy počítání v oktalové soustavě:
(5)8 + (5)8 = (12)8 //tedy nikoliv 10! (tak by to bylo v dekadické soustavě)
(10)8 – (5)8 = (3)8 //tedy nikoliv 5! (tak by to bylo v dekadické soustavě)
Oktalová soustava se v praxi používá například při přidělování práv v operačních systémech na bázi UNIXu (tedy ve všech ostatních než je Windows).
Vyzkoušejte si přičítání / odčítání jedniček v hexadecimální soustavě na zkušební stránce dekadické a oktalové soustavy.
Převod mezi binární a oktalovou soustavou
Převod probíhá velmi podobně jako je převod mezi binární a hexadecimální soustavou, pouze jdeme po trojicích. Můžeme opět použít pomocnou tabulku:
| Oktalová soustava | Binární soustava |
|---|---|
| 0 | 000 |
| 1 | 001 |
| 2 | 010 |
| 3 | 011 |
| 4 | 100 |
| 5 | 101 |
| 6 | 110 |
| 7 | 111 |
Převod je pak úplně analogický:
(101001)2 = (101 001)2 = (51)8
(11101)2 = (011 101)2 = (35)8
A převod na druhou stranu:
(70)8 = (111000)2
(37)8 = (011111)2