Čí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:

Desítková (dekadická) soustava

Desítková soustava používá deset různých cifer:

0
1
2
3
4
5
6
7
8
9

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:

0
1

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.

ČísloOperaceVýsledekModulus
70/ 2 =350
35/ 2 =171
17/ 2 =81
8/ 2 =40
4/ 2 =20
2/ 2 =10
1/ 2 =01

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:

1000110
* 26* 25* 24* 23* 22* 21* 20
64000420= 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:

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

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í soustavaBinární soustava
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111

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:

0
1
2
3
4
5
6
7

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á soustavaBinární soustava
0000
1001
2010
3011
4100
5101
6110
7111

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