Čí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 = 436110ABBA16 =
10 · 163 + 11 · 162 + 11 · 161 + 10 · 160 = 4396210CAF316 =
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.
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.
Číslo | děleno | modulo |
---|---|---|
132 | 13 | 2 |
13 | 1 | 3 |
1 | 0 | 1 |
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).
Číslo | děleno | modulo |
---|---|---|
12 | 6 | 0 |
6 | 3 | 0 |
3 | 1 | 1 |
1 | 0 | 1 |
Číslo | děleno | modulo |
---|---|---|
13 | 6 | 1 |
6 | 3 | 0 |
3 | 1 | 1 |
1 | 0 | 1 |
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
Převeď 16310 do dvojkové soustavy a 430510 do šestnáctkové soustavy. Výsledky se ti opět ukáží po kliknutí.
Číslo | děleno | modulo |
---|---|---|
163 | 81 | 1 |
81 | 40 | 1 |
40 | 20 | 0 |
20 | 10 | 0 |
10 | 5 | 0 |
5 | 2 | 1 |
2 | 1 | 0 |
1 | 0 | 1 |
Číslo | děleno | modulo |
---|---|---|
65201 | 4075 | 1 |
4075 | 254 | B (= 11) |
254 | 15 | E (=14) |
15 | 0 | F (=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é.
Číslo | děleno | modulo |
---|---|---|
2991 | 1495 | 1 |
1495 | 747 | 1 |
747 | 373 | 1 |
373 | 186 | 1 |
186 | 93 | 0 |
93 | 46 | 1 |
46 | 23 | 0 |
23 | 11 | 1 |
11 | 5 | 1 |
5 | 2 | 1 |
2 | 1 | 0 |
1 | 0 | 1 |
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