2. Převody čísel do různých soustav

V soustavách se užívají různé číslice, nebo písmena:

  • Ve dvojkové soustavě je základ soustavy 2 a používají se číslice 0 a 1
  • V osmičkové soustavě je základ 8 a používají se číslice 0, 1, 2, 3, 4, 5, 6 a 7
  • V desítkové soustavě je základ 10 a používají se číslice 0, 1, 2, 3, 4, 5, 6, 7, 8 a 9
  • V šestnáctkové soustavě je základ 16 a používají se číslice 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 a písmena, která vyjadřují zbytek větší než 9, tzn., A (pro číslo 10), B(11), C(12), D(13), E(14) a F(15)

Rozsah zobrazitelných čísel celých čísel při uložení ve dvou bytech je -215 až 215 – 1, tj.-32 768 až +32 767. Měli bychom podotknout, že intervalu náleží i 0, proto horní mez intervalu je rovna absolutní hodnotě meze dolního intervalu sníženého o 1.

Pozn.: Pro násobky se používají předpony k (kilo = 1024), M (mega = 1024x1024), G (giga = 1024x1024x1024). Tyto předpony se mírně liší od předpon používaných v matematice a fyzice. Vychází se z praktické potřeby práce ve dvojkové soustavě, neboť 1024 = 210 .


Algoritmus BinarniPrevodPodprogramValidace


Podstata příkladu převodu čísla zapsaného v desítkové soustavě a následným převodem do binární (dvojkové) soustavy tkví v celočíselném dělení hodnotou 2 a sledování zbytku po dělení v každé iteraci. V algoritmu má dojít k Validaci zadané hodnoty, tj. zda hodnota vyhovuje definovaným podmínkám – musí se pohybovat v rozmezí dolní meze intervalu (tj. 0) a horní meze intervalu (tj. 255). Proč jsme zvolili právě tyto meze? Protože minimální hodnota, kterou lze uložit do 1 B je 0. Jak víte, 1 B představuje 8 bitů. Na každé pozici čísla ve dvojkové soustavě může být buď 0, nebo 1. Pokud bychom tedy napsali na všechny pozice 0, bude toto číslo představovat v desítkové soustavě 0. Pokud bychom všude zapsali 1, představuje těchto osm jedniček hodnotu 255 v desítkové soustavě. Zvídavým lidem napovím, že podmínka horní meze je definována záměrně, aby nedošlo k přetečení 1 B (jednoho Byte). Tuto podstatu vysvětlíme při zpětném přepočtu čísla ve dvojkové soustavě zpět do desítkové soustavy.

Pro podprogram Validace je deklarována proměnná:

  • n – tato proměnná představuje validní hodnotu v desítkové soustavě zadanou uživatelem jako vstup

V podprogramu (funkci) Validace se nachází cyklus s podmínkou na konci, který testuje, zda zadaná hodnota splňuje podmínky. U cyklu je patrné, že cyklus zadávání vstupní hodnoty bude opuštěn pouze tehdy, pokud podmínka není splněna. Proto jsme tuto podmínku museli formulovat jako (n < 0) || (n > 255). To znamená, že pokud hodnota bude menší než 0, nebo bude větší než 255, podmínka cyklu bude splněna a zadávání vstupní hodnoty proběhne znovu. Pokud tato podmínka není splněna, opustí se cyklus a dojde k vykonání dalšímu kroku podprocesu. Tento krok představuje přiřazení proměnné n do výstupu podprogramu - funkce. Znamená to, že hodnota uložená v n bude předána zpět do algoritmu nazvaného BinarniPrevod, ze kterého byla vyvolána (spuštěna).

V deklaraci lokálních proměnných hlavního programu (Main), platných pouze pro algoritmus BinarniPrevod, jsou uvedeny dvě proměnné:

  • decimalniHodnota - představující hodnotu zadaného čísla v desítkové soustavě načtené ve funkci Validace, kde výstupní hodnota z této funkce byla přiřazena do této proměnné pomocí výrazu decimalniHodnota = Validace()

  • binarniText - představující textový řetězec (datový typ String) konvertovaného čísla z desítkové soustavy do dvojkové

Na začátku algoritmu binárního převodu je provedeno zavolání podprogramu – v našem případu funkce Validace (bez jakýchkoliv vstupních parametrů – proto prázdná závorka ve výrazu), která nám vrátí validní hodnotu zadaného čísla od 0 do 255. Obsah proměnné binarniText je před postupným plněním vymazán pomocí přiřazení prázdného řetězce (mezi dvojitými uvozovkami není žádný text). Konverze čísla je prováděna pomocí cyklu s podmínkou na začátku. Tato podmínka je vykonávána do té doby, dokud platí, že hodnota uložená v proměnné decimalniHodnota je větší než nula, tj. decimalniHodnota > 0 (stále existuje zbytek, kterým lze celočíselně dělit a zjišťovat zbytek po celočíselném dělení). Prvním krokem provedeným v rámci každé iterace cyklu je provedení celočíselného dělení číslem 2 (je to dvojková soustava – existují pouze dvě číslice 0 nebo 1). Pokud je tento zbytek roven 0, tj. podmínka decimalniHodnota % 2 == 0, pak do textu v proměnné binarniText potřebujeme zleva připojit text “0“ (do datového typu String, čili text, můžeme vkládat pouze text, proto použití uvozovek). Pokud tomu tak není, tzn., že zbytek po celočíselném dělení je 1, připojíme do proměnné binarniText zleva text “1“. V dalším kroku provedeme celočíselné dělení číslem 2. Všimněme si, že tuto novou hodnotu získanou z vyhodnocení pravé strany od rovnítka, přepíšeme dosavadní hodnotu uloženou v proměnné decimalniHodnota. Co ta znamená? Nic zásadního, pokud nepotřebujeme vypsat počáteční validní hodnotu obdrženou z funkce, kterou jsme uložili do proměnné decimalniHodnota. Tím že postupně přepisujeme tuto hodnotu, si ušetříme místo v paměti, protože nepotřebujeme deklarovat další proměnnou, která by zabírala místo v paměti. Po opuštění cyklu je uživateli vypsán text “Číslo ve dvojkové soustavě:“ a za ním je vypsána hodnota konvertovaného čísla do dvojkové soustavy. Pro spojení dvou textů (konkatenace) dohromady jsme využili operátoru &.


Algoritmus DecimalniPrevodPodprogramValidace


Pro podprogram Validace, jenž je funkce s výstupem ve formě celého čísla (datový typ Integer), jsou deklarovány následující proměnné:

  • binarniHodnota – tato celočíselná binární hodnota (datový typ int) zadaná na 1 Byte, čili 8 bitech (každý bit může obsahovat 1 nebo 0) je konvertována do decimální (desítkové) soustavy
  • binarniHodnotaPom – pomocná proměnná, která nám bude sloužit pro provedení testů validace
  • posledniCislice – proměnná pro uložení zbytku po celočíselném dělení binární hodnoty hodnotou 10
  • pocetChybnychBitu –počet zjištěných chybných pozic (bitů) v zadané celočíselné binární hodnotě
  • pocetPlatnychBitu – počet zjištěných platných pozic (bitů) v zadané celočíselné binární hodnotě
  • celkovyPocetBitu – celkový počet zadaných bitů
  • chyba – informace (Booleanovská proměnná) zda v zadané binární hodnotě byla nalezena chyba (buď ve formě celkové počtu zadaných bitů, nebo jiné než možné hodnoty uložené v bitu). Možná hodnota uložená v této proměnné datového typu bool je hodnota True (zjištěna chyba v zadané binární hodnotě) nebo False (zjištěna chyba v binární hodnotě)

Na začátku funkce Validace je uživatel vyzván, aby zadal binární hodnotu maximálně ve velikosti 8 bitů, což představuje 1 Byte. Po načtení a uložení této hodnoty do proměnné binarniHodnota je tato hodnota překopírována do pomocné proměnné, kterou postupně budeme testovat. Je také nutné inicializovat proměnné pocetChybnychBitu, pocetPlatnychBitu a celkovyPocetBitu na počáteční hodnotu 0. Cyklus testuje sestupně platnost bitů od nejvyšší pozice s desítkovým základem. Pokud nejvyšší pozice obsahuje jedničku, představuje desítky miliónů, tj. 1*107 (osmá pozice bitu zprava). Nejvyšší číslo, co může uživatel v binární podobě zadat, je tedy 11111111. V první iteraci jsou testovány desítky miliónů a v poslední iteraci jsou testovány jedničky (pokud na první pozici binární hodnoty zprava je umístěna 1, pak tato hodnota představuje číslo 1*100 = 1). Za účelem testování této pozice využijeme operaci zbytku po celočíselném dělení – operátor %. Spočtenou hodnotu zbytku po celočíselném dělení si uložíme do proměnné posledniCislice. Pokud tato číslice neobsahuje 0 nebo 1, je provedena inkrementace počtu chybných pozic (zvýšení aktuální hodnoty o 1). Tato hodnota je uložena do proměnné pocetChybnychBitu. Pokud nebyla zjištěna chyba na aktuální pozici (v první iteraci je to první pozice v binární hodnotě zprava), je zvýšen aktuální počet platných pozic o 1. Tato hodnota je uložena do proměnné pocetPlatnychBitu. Po ukončení rozhodovacího bloku je provedeno celočíselné dělení desítkou, proto abychom se posunuli na další pozici vlevo od aktuální pozice (ve druhé iteraci budeme testovat desítky). Po provedení všech iterací se dostaneme v pomocné proměnné binarniHodnotaPom na hodnotu 0 (při každé iteraci jsme snižovali o desítkový řád), tzn., cyklus testování platnosti bitů je ukončen a přecházíme k dalšímu procesu, který spočte celkový počet bitů. Tento celkový počet představuje sečtení zjištěného počtu chybných a platných bitů. Tento počet využijeme při dalším testování. Pokud je počet chybných bitů větší než 0, nebo celkový počet bitů je větší než 8, tak se ve vývojovém diagramu vydáme za rozhodovacím blokem větví True, tj., byla splněna alespoň jedna z definovaných podmínek chyby. Další následná rozhodovací podmínka v této větvi testuje, zda byl překročen počet povolených bitů. Pokud ano, je uživateli vypsáno varování: Validace počtu bitů: neúspěšná - celkový počet bitů: a za tento text je umístěna hodnota celkového počtu bitů. Pokud byl dodržen celkový počet bitů, vydáme se v algoritmu větví False. Dalším prováděným testem po předchozím testu je test na počet chybných bitů v binární hodnotě. Pokud byl zjištěn nějaký chybný bit, je uživateli zobrazeno hlášení o neúspěšné validaci včetně vypsání zjištěného počtu neplatných bitů. Vzhledem k tomu, že bylo zjištěno alespoň jedno pochybení, ať už ve formě překročení celkového počtu bitů, nebo neplatné hodnoty bitu, musíme uložit tuto informaci do proměnné chyba. Tato Booleanovská proměnná může nabývat hodnoty True, tj., byla zjištěna chyba v zadané binární hodnotě, nebo False (nebyla zjištěna chyba – ve vývojovém diagramu jsme v záporné větvi za testem (pocetChybnychBitu > 0) || (celkovyPocetBitu > 8). Celý proces zadávání binární hodnoty je opakován, dokud byla nalezena nějaká chyba v binární hodnotě – cyklus s podmínkou (chyba == True) na konci. Po správném zadání binární hodnoty je platná hodnota předána zpět do algoritmu DecimalniPrevod, ze kterého byla funkce zavolána.


Pro algoritmus DecimalniPrevod jsou deklarovány následující proměnné:

  • binarniHodnota – do této proměnné je uložena celočíselná hodnota vrácená z funkce Validace. Tato hodnota je následně konvertována do desítkové soustavy
  • decimalniHodnota – do této proměnné je uložena celočíselná výsledná hodnota v desítkové soustavě
  • posledniCislice – do této proměnné je postupně ukládán koeficient (1 nebo 0), kterým je násoben základem binární soustavy uložené v proměnné zaklad
  • zaklad – základ binární soustavy (tj. 2x, kde x představuje index od 0 až 7 v případě osmi bitů. Pro první bit zprava u binární hodnoty je základ 20 = 1, pro druhý zprava je základ 21=2, pro třetí 22=4, atd.)

Na začátku algoritmu je provedeno uložení binární hodnoty získané z funkce Validace do proměnné binarniHodnota. Následuje nastavení počáteční hodnoty u proměnné decimalniHodnota na hodnotu 0 a základu binární soustavy na hodnotu 1 (v první iteraci je základ 20 = 1). Po provedení inicializace je prováděn cyklus s podmínkou na začátku představující postupné plnění proměnné decimalniHodnota postupným násobením bitů z binárního čísla základem dvojkové soustavy. Prvním krokem prováděným v tomto cyklu je zjištění poslední číslice, tzn., číslice zprava z binárního čísla, tedy 0 nebo 1. Pro zjištění číslice využijeme operaci zbytku po celočíselném dělení hodnotou 10. Zjištěnou hodnotu si uložíme do proměnné posledniCislice. Následný proces celočíselného dělení hodnotu 10, je prováděn proto, abychom oddělili první bit zprava v binární hodnotě. Tím se nám binární hodnota zmenší. Decimální hodnotu čísla pro daný bit spočteme tak, že k aktuální hodnotě decimálního čísla (před první iterací je tato hodnota 0 – hodnota nastavena před vstupem do cyklu) přičteme hodnotu poslední číslice zprava v binární hodnotě násobenou základem. V první iteraci je tento základ 1, protože 20 = 1. Po uložení vypočtené decimální hodnoty musíme změnit základ. Tento základ dvojkové soustavy se v každé iteraci mění. Pro první iteraci byl 20 = 1, pro druhou iteraci je 21 = 2, pro třetí 22 = 4, atd. Uvědomme si, že 22 lze rozepsat jako 22 = 2 * 2 = 4. Proto základ můžeme rozepsat pomocí výrazu zaklad = zaklad * 2, který popisuje princip postupného násobení základu dvojkou (první iterace je 20 = 1, další je 1*2, další je 1*2*2, atd.).

Jakmile proběhnou všechny iterace nutné k výpočtu výsledné decimální hodnoty, je tento výsledek zobrazen uživateli včetně popisku, že se jedná o konvertované číslo.