Číselné soustavy

Co je to číselná soustava? Číselná soustava je jasně daný způsob zápisu čísel (hodnot, které reprezentují) pomocí číslic (symbolů).

Asi málokdo nikdy neslyšel v souvislosti s počítači o jedničkách a nulách. Proč o nich ale v tomto kontextu mluvíme?

Jedničky a nuly jsou jedinými symboly binární (dvojkové) soustavy. A dnešní počítače používají právě dvojkovou soustavu pro uchovávání a práci s daty, a proto by ji každý, kdo se chce informatikou alespoň trochu zabývat, měl znát.

Předtím, než se podíváme na binární soustavu, si zopakujeme soustavu desítkovou, tedy tu, kterou používáme dnes a denně. Pak se zaměříme na dvojkovou soustavu a ukážeme si i soustavu šestnáctkovou, se kterou se také můžeme běžně setkat. Nakonec si ukážeme, jak čísla napříč různými soustavami převádět.

Desítková (dekadická) soustava

Jak už název napovídá, desítková soustava pracuje s desíti symboly: 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9. Jiné symboly v čísle zapsaném v desítkové soustavě nenajdeme. Naše desítková soustava je tzv. poziční číselnou soustavou. To znamená, že hodnotu takto zapsaného čísla získáme z hodnoty jednotlivých číslic v závislosti na jejich poloze – za každé posunutí cifry doleva její hodnotu násobíme desítkou. Můžeš se na to dívat i tak, že pokud k číslu přičítáme jedničku, další cifru dostaneme až poté, co se na stávající pozici vystřídá deset hodnot (od 0 po 9).

Počet hodnot, kterých v soustavě může nabývat jedna cifra, značí bázi číselné soustavy a typicky jí odpovídá i název (desítková soustava – deset symbolů – báze 10).

My si v této kapitole ukážeme několik používaných soustav, ale nikomu nic nebrání vytvořit si vlastní s libovolnou bází. Číslice jsou jen symboly, a jak později uvidíme, můžeme použít i písmena, a počet symbolů nám značí bázi. Zbytek funguje stejně ve všech (pozičních) soustavách.

  • 42 – čtyři desítky a dvě jednotky
  • 24 – dvě desítky a čtyři jednotky
  • 512 – pět stovek, jedna desítka a dvě jednotky
  • 66 – šest desítek a šest jednotek
  • 10 – jedna desítka a žádné jednotky
  • 1024 – jeden tisíc, nula stovek, dvě desítky a čtyři jednotky

Je dobré si uvědomit, že poziční soustavy nám přináší několik výhod, díky kterým se nám s čísly lépe pracuje.

Jednou z výhod je snadné porovnávání dvou čísel. V tu chvíli nám stačí podívat se, které z čísel má delší zápis, abychom věděli, které je vyšší. V případě, že jsou obě stejně dlouhé nám stačí čísla porovnávat cifru po cifře, dokud nenarazíme buď na konec (a v takovém případě jsou čísla stejná), nebo na cifru, na které se čísla liší – v takovém případě je vyšší to číslo, které má na první takové cifře číslici s vyšší hodnotou.

Druhou výhodou, kterou poziční soustavy přinášejí, jsou techniky jako třeba počítání s čísly pod sebou. Například při sčítání pod sebou vždy sčítáme spolu jen ty cifry, které jsou na stejných pozicích a o ostatní pozice se nezajímáme (musíme si samozřejmě pohlídat přenos do vyšších řádů), čímž sčítání dvou libovolně velkých čísel umíme redukovat na sčítání dvou, respektive tří (i s převodem) jednociferných čísel.

Možná je to překvapivé, ale ne všechny soustavy tak fungovaly. Vzpomeň si například na římské číslice, které jsi určitě viděl na základní škole. Číslo 2024 bychom v ní zapsali jako MMXXIV – všimni si, že například znak M odpovídá tisíci nehledě na to, na které pozici se nachází.

Schválně si zkus sečíst pod sebou dvě čísla v desítkové soustavě. Pak si zkus sečíst dvě čísla zapsané v Římské číselné soustavě, které je nepoziční.

Všechny soustavy, které si dnes ukážeme, jsou poziční.

Různé způsoby zápisu čísla

Podívejme se ještě na jeden trik, který s číselnými soustavami přímo nesouvisí, ale u ostatních soustav nám přijde vhod, a tím jsou různé zápisy čísla. Ty nám usnadňují práci s čísly, která by jinak byla nepohodlná (např. existuje takzvaná vědecká notace, díky které můžeme úsporně zapsat velmi malá nebo naopak velmi velká čísla).

Nás teď bude zajímat zápis čísel, který si možná budeš pamatovat ze začátku základní školy. Tak, jako jsme v příkladě výše rozepisovali číslo 42 jako čtyři desítky a dvě jednotky, tak stejným způsobem zapíšeme jiná čísla s pomocí násobení čistě numericky:

452 = 4 · 100 + 5 · 10 + 2 · 1

1024 = 1 · 1000 + 0 · 100 + 2 · 10 + 4 · 1

Každé číslo v desítkové soustavě můžeme zapsat tímto způsobem. Pojďme tento zápis lehce vylepšit a namísto tisíců, stovek či jednotek použijme mocniny báze:

452 = 4 · 102 + 5 · 101 + 2 · 100

1024 = 1 · 103 + 0 · 102 + 2 · 101 + 4 · 100

Pro lepší pochopení dalších soustav (a pak především při převodech mezi soustavami) se nám tento způsob zápisu bude hodit.

Dvojková (binární) soustava

Stejně jako desítková i binární soustava je poziční. Na rozdíl od desítkové si při zápisu čísel musíme vystačit s pouhými dvěma znaky. To znamená, že čísla ve dvojkové soustavě budou mít zpravidla delší zápis než ty v desítkové, protože tam, kde bychom v desítkové soustavě nahradili jedničku dvojkou, musíme v dvojkové soustavě napsat nulu a zvýšit hodnotu v cifře o řád vyšší. Na stranu druhou, přesně tato vlastnost je důvodem, proč v počítačích používáme binární soustavu – je zkrátka jednodušší vytvořit paměťovou buňku, která umí nabývat pouze dvou stavů (0 a 1) než desíti. Zvlášť když se počty takových buněk v dnešních počítačích pohybují v bilionech.

Zmíněným paměťovým buňkám v počítači říkáme bity. K těm se úzce vážou i bajty, které se z bitů skládají. Oběma jednotkám a paměti celkově se věnujeme v samostatném textu.

V dalších částech textu se u čísel budeš moci setkat s dolním indexem. Ten budu používat pro explicitní určení báze (tj. soustavy), ve které je číslo zapsané.

Například 210 je naše dvojka v desítkové soustavě, kdežto 112 je trojka zapsaná ve dvojkové soustavě. V případě, že číslo žádný dolní index mít nebude, je zapsáno v desítkové soustavě, jak jsme zvyklí.

Podívejme se na prvních pár čísel z desítkové a dvojkové soustavy.

  • 010 = 02
  • 110 = 12
  • 210 = 102
  • 310 = 112
  • 410 = 1002
  • 510 = 1012
  • 610 = 1102
  • 710 = 1112
  • 810 = 10002
  • 910 = 10012
  • 1010 = 10102
  • 1110 = 10112
  • 1210 = 11002
  • 1310 = 11012
  • 1410 = 11102
  • 1510 = 11112
  • 1610 = 100002
  • 1710 = 100012

Jak je vidět, na nule a jedničce žádný rozdíl nenajdeme. Už u dvojky ale vidíme něco zajímavého. Zatímco v desítkové soustavě píšeme 2, jak jsme zvyklí, ve dvojkové soustavě další symbol nemáme a musíme tedy přejít do vyššího řádu. Stejná situace nastává u čtyřky. Jak jsme si řekli, délka zápisu roste mnohem rychleji než v případě desítkové soustavy.

Podívejme se na převod z dvojkové do desítkové soustavy. V předchozí části jsme si ukázali zápis čísla v desítkové soustavě jako součet hodnot jednotlivých cifer násobených mocninou báze. Zkusme použít stejný zápis i pro číslo ve dvojkové soustavě.

1102 = 1 · 22 + 1 · 21 + 0 · 20

10012 = 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20

Když si číslo zapíšeme takto, od získání jeho hodnoty v desítkové soustavě nás už dělí pouze dopočítání odpovídajících součtů. V prvním případě tedy získáme číslo 6, v druhém případě číslo 9 (v desítkové soustavě).

Převeď následující čísla z dvojkové do desítkové soustavy.

  • 1012 = 1 · 22 + 0 · 21 + 1 · 20 = 4 + 1 = 5
  • 102 = 1 · 21 + 0 · 20 = 2
  • 10012 = 1 · 23 + 0 + 0 + 1 · 20 = 9
  • 110002 = 1 · 24 + 1 · 23 = 16 + 8 = 24
  • 10102 = 1 · 23 + 1 · 21 = 10
  • 11102 = 1 · 23 + 1 · 22 + 1 · 21 = 14
  • 10012 = 1 · 23 + 0 + 0 + 1 · 20 = 9
  • 110002 = 1 · 24 + 1 · 23 = 16 + 8 = 24

Výsledek získáš po kliknutí na daný příklad.

Převodu druhým směrem (tj. z desítkové) se budeme věnovat v poslední kapitole. Nejdřív se však krátce zastavíme u slíbené šestnáctkové soustavy, s tou se můžeme setkat možná častěji než s dvojkovou.

Šestnáctková (hexadecimální) soustava

Šestnáctková číselná soustava, jak již název napovídá, má šestnáct hodnot pro jednu cifru: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E a F. Pokud bychom v desítkové soustavě museli přenášet do vyššího řádu, tj. z 9 pokračovat na 10, v šestnáctkové soustavě půjdeme z 9 na A. Hodnoty zapsané v šestnáctkové soustavě tedy budou kratší (budou mít méně cifer) než jejich zápis v desítkové a především ve dvojkové soustavě. To je ostatně také jeden z hlavních důvodů, proč šestnáctkovou soustavu používáme.

  • 010 = 016
  • 110 = 116
  • 210 = 216
  • 310 = 316
  • 410 = 416
  • 510 = 516
  • 610 = 616
  • 710 = 716
  • 810 = 816
  • 910 = 916
  • 1010 = A16
  • 1110 = B16
  • 1210 = C16
  • 1310 = D16
  • 1410 = E16
  • 1510 = F16
  • 1610 = 1016
  • 1710 = 1116

Převod do desítkové soustavy funguje stejně jako v případě dvojkové, opět si rozepíšeme převáděné číslo tak, abychom viděli bázi explicitně a hodnoty jednotlivých cifer sečteme.

1F16 = 1 · 161 + 15 · 160 = 3110

C416 = 12 · 161 + 4 · 160 = 19610

Všimni si, že v případě šestnáctkových číslic násobíme mocninu báze jejich hodnotou v desítkové soustavě (např. místo C píšeme 12). Doposud jsme tento převod explicitně dělat nemuseli, protože nula i jednička ve dvojkové soustavě odpovídá nule a jedničce v desítkové.

Zkus si následující převody sám.

120916 = 1 · 163 + 2 · 162 + 9 · 160 = 1 · 4096 + 2 · 256 + 9 = 436110
ABBA16 = 10 · 163 + 11 · 162 + 11 · 161 + 10 · 160 = 4396210
CAF316 = 12 · 163 + 10 · 162 + 15 · 161 + 3 · 160 = 5195510

Šestnáctkovou soustavu ale zpravidla nepoužíváme místo desítkové soustavy, ale většinou místo dvojkové. Díky tomu, že šestnáct je mocninou dvojky (24), zachovává si šestnáctková soustava vlastnosti dvojkové s výhodou kratšího zápisu – pro vyjádření čtyř cifer ve dvojkové soustavě nám stačí právě jeden znak v šestnáctkové soustavě.

  • 02 = 016
  • 12 = 116
  • 102 = 216
  • 112 = 316
  • 1002 = 416
  • 1012 = 516
  • 1102 = 616
  • 1112 = 716
  • 10002 = 816
  • 10012 = 916
  • 10102 = A16
  • 10112 = B16
  • 11002 = C16
  • 11012 = D16
  • 11102 = E16
  • 11112 = F16
  • 100002 = 1016
  • 100012 = 1116

Díky této vlastnosti jsou i převody mezi těmito dvěma soustavami přímočaré. Pro převod z dvojkové soustavy do šestnáctkové nám stačí každé čtyři cifry dvojkové přepsat na jedinou šestnáctkovou. Jediné, na co si musíme dát pozor, je, aby číslo, které převádíme mělo délku dělitelnou čtyřmi, jinak musíme na začátek doplnit příslušný počet nul (stejně jako bychom z 1210 udělali čtyřciferné číslo doplněním nul 001210). Alternativně můžeme převod začít od nejnížších cifer, takže nakonec ve vyšších řádech skončíme s méně než čtyřmi ciframi a nuly doplníme až během převodu.

  • 112 = 00112 = 316
  • 10102 = A16
  • 11112 = F16
  • 111111112 = 1111 11112 = FF16
  • 000111112 = 0001 11112 = 1F16
  • 100000012 = 1000 00012 = 8116

Převody opačným směrem pak fungují úplně stejně. Každou šestnáctkovou cifru nahradíme čtyřmi ciframi ve dvojkové soustavě.

  • A16 = 10102
  • 1F16 = 1 F16 = 0001 11112
  • E016 = E 016 = 1110 00002
  • 120916 = 0001 0010 0000 10012
  • ABBA16 = 1010 1011 1011 10102
  • CAF316 = 1100 1010 1111 00112

Díky svým vlastnostem našla šestnáctková soustava své využití tam, kde chceme kombinovat výhody binární soustavy (korespondence s paměťovými buňkami) s výhodou kratšího zápisu.

Jednou z oblastí, kde se s šestnáctkovou soustavou můžes setkat, je práce s barvami. Pokud vytváříš web, pracuješ s photoshopem nebo si chceš jen sám zvolit přesnou barvu v nějakém kancelářském balíku, většinou můžeš barvu zadat v RGB (Red-Green-Blue) formátu, kdy intenzitu každé barvy vyjadřujeme dvěma číslicemi šestnáctkové soustavy. Čím vyšší hodnota složky, tím vyšší intenzita barvy.

Přítomnost všech složek nám dá jasně bílou barvu
Růžovou až fialovou dostaneme zeslabením zelené složky
Zelenou až khaki získáme kombinací červené a zelené

Kdybychom chtěli druhou barvu (ff78ff) zapsat v binární soustavě, potřebovali bychom následujících dvacet čtyři cifer: 11111111 01111000 11111111.

Další využití šestnáctkové soustavy můžeme najít v oblasti sítí, kde se dlouho používá pro tzv. MAC adresy. V dnešním internetu se pomalu ale jistě prosazuje IP protokol ve své šesté verzi (podrobněji se sítím budeme věnovat v samostatném textu), jenž pro jednu IP adresu používá 128 bitů (16 bajtů). Kdybychom si chtěli takovou adresu zapisovat binárně nebo třeba (po jednotlivých bajtech) dekadicky, byl by takový zápis poměrně dlouhý. Místo toho se IPv6 adresa zapisuje šestnáctkově po dvou bajtech (např. fe80:abcd:1111:1111:cafe:00bc:0000:0001).

Můžeš se s ní potkat i při programování. Například zápis adres jednotlivých paměťových buněk v počítači bývá realizován v šestnáctkové soustavě.

Převody mezi soustavami

Teď, když už známe několik číselných soustav, se podíváme na převody nejen mezi nimi, ale mezi jakýmikoliv číselnými soustavami navzájem. U soustav, kde je jeden základ násobkem druhého je práce poměrně jednoduchá, protože můžeme pracovat s jednotlivými ciframi / skupinami cifer tak, jak jsme si to už ukázali v případě šestnáctkové s dvojkovou.

Pro soustavy, kde si báze takto pěkně neodpovídají si ukážeme možná trošku složitější, zato ovšem univerzální způsob.

Budeme potřebovat funkci s poněkud tajemným názvem – modulo. Funkce samotná ale nijak složitá není, ve skutečnosti se jedná o zbytek po dělení. Značit ji budeme mod.

Ukážeme si pár příkladu vyhodnocení funkce modulo.

  • 13 mod 5 = 3 (tj. zbytek po dělení třinácti pětkou je tři)
  • 28 mod 5 = 3 (zbytek po dělení dvaceti osmi pětkou je zase tři)
  • 8 mod 2 = 0 (zbytek po dělení osmi dvojkou je nula)
  • 42 mod 50 = 42 (zbytek po dělení čtyřiceti dvou padesátkou je čtyřicet dva)

V informatice ji používáme vcelku často, a proto je dobré vědět, co se pod tímto názvem skrývá.

S funkcí modulo a klasickým dělením se můžeme pustit do převodu napříč soustavami.

Převod se skládá ze dvou částí. V první části převedeme dané číslo do desítkové soustavy. To už umíme – číslo si rozepíšeme s explicitní bází, každou cifru spočítáme zvlášť a mezivýsledky sečteme.

V druhé fázi máme číslo v desítkové soustavě, které chceme převést do jiné. Abychom jej převedli, začneme číslo postupně dělit novou bází, dokud se nedostaneme na nulu, přičemž si v průběhu dělení zapisujeme mezivýsledky funkce modulo (tj. zbytky po dělení). Jakmile dosáhneme nuly, máme hotovo, přičemž jsou to právě zapsané mezivýsledky, které popisují, jak bude číslo v nové bázi vypadat – stačí jejich pořadí otočit tak, aby poslední zbytek po dělení byl na nejvyšší (nejlevější) cifře a první zbytek po dělení na nejnižší (čili na místě jednotek).

Proč musíme mezivýsledky nakonec otočit? Je potřeba si uvědomit, co postupnou aplikací dělení získáváme. Podívejme se spolu na převod čísla 132 z desítkové soustavy do desítkové (ano, opravdu) soustavy, půjde to pěkně vidět.

fáze 1: dostáváme 13210 = 1 · 102 + 3 · 101 + 2 · 0 = 13210.

fáze 2: začínáme postupně dělit číslo deseti, protože převádíme do desítkové soustavy, a zapisovat zbytky. Celý proces si zapíšeme do tří sloupců – v prvním máme aktuální hodnotu, kterou převádíme, v druhém je výsledek dělení desíti a ve třetím výsledek funkce modulo deseti. Dokud není výsledkem dělení nula, tak výsledek opíšeme do prvního sloupečku následujícího řádku.

Číslodělenomodulo
132132
1313
101

Zbytky, které jsme zapsali, jsou 2, 3, a 1. Když je otočíme, získáme 132.

Všimni si, že ve sloupečku výsledků modulo máme postupně hodnoty jednotek, desítek a stovek původního čísla. Můžeš se na to dívat i tak, že opakovaným dělením se posouváme po cifrách čísla doleva, zatímco modulem čteme hodnotu aktuální cifry. Pak cifra, kterou přečteme jako poslední, musí odpovídat hodnotě nejvyšší cifry, a proto je třeba ono otočení.

Zkusme si teď pomocí stejného postupu převést čísla 1210 a 1310 do binární soustavy.

Jelikož obě čísla už máme v desítkové soustavě, můžeme fázi jedna přeskočit. Ve fázi dva si zase vytvoříme tři sloupce jako v přechozím příkladě, tentokrát však nebudeme dělit a zapisovat zbytky po dělení 10, ale po dělení 2 (protože převádíme do dvojkové soustavy, je bází číslo 2).

Číslodělenomodulo
1260
630
311
101
Číslodělenomodulo
1361
630
311
101

Získáváme tedy 1210 = 11002 a 1310 = 11012 a převodem zpátky z dvojkové do desítkové si můžeme snadno ověřit, že jsou to správné výsledky:

11002 = 1 · 23 + 1 · 2 + 0 · 21 + 0 · 20 = 1210

11012 = 1 · 23 + 1 · 2 + 0 · 21 + 1 · 20 = 1310

Stejným způsobem můžeme převádět mezi libovolnými dvěma soustavami. Následuje pár příkladů, na kterých si můžeš vyzkoušet, jestli látce rozumíš. Rozhodně doporučuji podívat se do záložky procvičování tady na webu, kde najdeš příkladů mnohem více.
Převeď 16310 do dvojkové soustavy a 430510 do šestnáctkové soustavy. Výsledky se ti opět ukáží po kliknutí.
Číslodělenomodulo
163811
81401
40200
20100
1050
521
210
101
Pozn.: hodnoty ve sloupci modulo musíme převést na odpovídající cifry výsledné soustavy
Číslodělenomodulo
6520140751
4075254B (= 11)
25415E (=14)
150F (=15)

Dostáváme 16310 = 101000112 a 430510 = FEB116

Převeď BAF16 do dvojkové soustavy.

Nejprve číslo převedeme univerzálním způsobem převodem se dvěmi fázemi.

fáze 1: BAF16 = 11 · 162 + 10 · 161 + 15 · 160 = 2816 + 160 + 15 = 2991

fáze 2: Číslo jsme převedli do desítkové, teď jej můžeme převést do dvojkové.

Číslodělenomodulo
299114951
14957471
7473731
3731861
186930
93461
46230
23111
1151
521
210
101

Dostáváme BAF16 = 1011 1010 11112. Zkoušku ponecháme na čtenáři a podíváme se, jak bychom číslo mohli převést z šestnáctkové soustavy do dvojkové napřímo.

Pro převod si musíme uvědomit, že jedna cifra šestnáctkové soustavy obsáhne přesně čtyři cifry dvojkové. Můžeme proto jít po jednotlivých cifrách a každou z nich nahradit odpovídající čtyřcifernou hodnotou v dvojkové soustavě.

BAF16 = B A F16 = 1011 1010 11112

Shrnutí

  • číselná soustava, kterou dnes a denně používáme se nazývá desítková (dekadická)
  • počítače jsou založené na dvojkové (binární) soustavě, jedinými číslicemi jsou 0 a 1
  • v informatice se často můžeme setkat s šestnáctkovou (hexadecimální) soustavou, která k desíti číslicím desítkové soustavy přidává šest dalších: A, B, C, D, E, F
  • v principu nám nic nebrání vytvořit si vlastní číselnou soustavu, potřebujeme jen určit pořadí cifer
  • ukázali jsme si funkci modulo a řekli si, že jde vlastně o zbytek po dělení
  • naučili jsme se jak lze mezi libovolnými dvěma číselnými soustavami převádět: vstupní číslo převedeme do desítkové soustavy (fáze 1) z ní pak do výstupní soustavy (fáze 2)

Na konci této kapitoly bys měl být schopen:

  • vysvětlit pojem číselné soustavy
  • intuitivně chápat rozdíl mezi hodnotou a znakem pro hodnotu: 310 = 112 = 316
  • umět vysvětlit co je to modulo
  • převádět malá čísla mezi dvojkovou, desítkovou a šestnáctkovou soustavou