dodání ihned! nové
Hledáme programátora do rostoucího týmu ITnetwork.cz, 100% home office, 100% flexibilní pracovní doba. Více informací
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
BF

Lekce 12 - Převod čísel mezi číselnými soustavami

V minulé lekci, Výpočet řešení kvadratické rovnice, jsme si ukázali algoritmus pro výpočet řešení kvadratické rovnice včetně zdrojového kódu a vývojového diagramu.

Číselná soustava je způsob zápisu číselných hodnot pomocí předem dané množiny znaků. Každý znak reprezentuje nějakou konkrétní číselnou hodnotu. Pokud chceme vyjádřit číselnou hodnotu, které neodpovídá žádný znak z dané množiny, tak musíme použít kombinaci těchto znaků.

Vyšší soustavy, kterým nestačí číslice 0-9, používají pro doplnění znaků písmena anglické abecedy.

Číselných soustav existuje nepřeberné množství. V běžném životě se nejčastěji setkáváme s desítkovou soustavou, která pro zápis čísel používá deset znaků (číslic 0-9). Ve světě počítačů se však ujala dvojková soustava, jelikož čísla se v ní dají jednoduše vyjádřit pomocí dvou hodnot elektrického napětí. Dále se také můžeme setkat se šestnáctkovou soustavou využívající číslice 0-9 a prvních šest písmen anglické abecedy (A-F), která se používá např. pro kódy barev. Proto se nám někdy může hodit umět čísla mezi soustavami převádět.

Převod čísel z desítkové soustavy

Pro převod čísel z desítkové soustavy se používá algoritmus využívající zbytků po celočíselném dělení základem požadované soustavy (pro dvojkovou soustavu je to číslo 2, pro šestnáctkovou 16 atd.).

Převáděné číslo vydělíme základem požadované soustavy, zapíšeme si zbytek do řetězce a výsledek dělení si uložíme. Dále již dělíme výsledek předchozího dělení a celý proces opakujeme, až dojdeme k výsledku 0. Výsledným číslem v požadované soustavě je řetězec zbytků po dělení v obráceném pořadí.

Ukažme si to na převodu čísla 13 do dvojkové soustavy:

13 / 2 = 6 zbytek 1

6 / 2 = 3 zbytek 0

3 / 2 = 1 zbytek 1

1 / 2 = 0 zbytek 1

Výsledné číslo jsou zbytky přečtené od spodu nahoru, tedy 1101.

Převod čísla 12 např. do třináctkové soustavy by vypadal následovně:

12 / 13 = 0 zbytek 12

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Výsledné číslo jsou opět zbytky přečtené od spodu nahoru. Zde máme jen jediný zbytek, a to číslo 12. Tato 12 je však stále v desítkové soustavě, musíme ji převést do třináctkové. Třináctková soustava využívá číslice 0-9 a první tři písmena anglické abecedy (A-C). Ve třináctkové soustavě se tedy číslo 12 zapíše jako C. Číslo 13 v desítkové soustavě by se pak ve třináctkové zapsalo jako 10:

13 / 13 = 1 zbytek 0

1 / 13 = 0 zbytek 1

Implementace

V prvním vstupu zadáme programu libovolné číslo v desítkové soustavě, např. 13. Ve druhém vstupu zadáme základ soustavy, do které chceme zadané číslo převést, např. do dvojkové, zadáme 2:

Console.WriteLine("Zadejte číslo v desítkové soustavě:");
int cislo = int.Parse(Console.ReadLine());

Console.WriteLine("Zadejte základ soustavy, do které chcete převést:");
int zakladSoustavy = int.Parse(Console.ReadLine());

string znaky = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string obracenyVysledek = "";
string vysledek = "";
int mezivysledek = cislo;

if (zakladSoustavy > 1 && zakladSoustavy <= znaky.Length)
{
    do
    {
        int zbytek = mezivysledek % zakladSoustavy;
        mezivysledek /= zakladSoustavy;
        obracenyVysledek += znaky[zbytek];
    }
    while (mezivysledek != 0);

    for (int i = obracenyVysledek.Length - 1; i >= 0; i--)
        vysledek += obracenyVysledek[i];
}

Console.WriteLine("\nVýsledek: {0}",vysledek);

Výsledek v konzoli:

Konzolová aplikace
Zadejte číslo v desítkové soustavě:
13
Zadejte základ soustavy, do které chcete převést:
2

Výsledek: 1101

Převod čísel do desítkové soustavy

Pro převod čísel do desítkové soustavy se využívá toho, že každá cifra čísla představuje hodnotu určitého číselného řádu.

Ukažme si to na čísle 6308 v desítkové soustavě. Toto číslo se skládá ze 6 tisíců (103), 3 stovek (102), 0 desítek (101) a 8 jednotek (100). Mohli bychom ho tedy rozepsat na tento mnohočlen:

6 * 103 + 3 * 102 + 0 * 101 + 8 * 100

6 * 1000 + 3 * 100 + 0 * 10 + 8 * 1

První číslici zprava násobíme nultou mocninou desítky, druhou první mocninou desítky, třetí druhou mocninou desítky atd.

Úplně stejně to funguje i v ostatních soustavách. Zde však jednotlivé řády nejsou mocniny desítky, ale mocniny základu dané soustavy. Například číslo 10110 ve dvojkové soustavě se dá rozepsat na tento mnohočlen:

1 * 10000 + 0 * 1000 + 1 * 100 + 1 * 10 + 0 * 1

Čísla 10000, 1000, 100 a 10 jsou tady ve dvojkové soustavě.

V případě, že všechna čísla mnohočlenu převedeme do desítkové soustavy a mnohočlen spočítáme, tak získáme dané číslo v desítkové soustavě:

1 * 16 + 0 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 22

1 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 0 * 20 = 22

Ukažme si ještě převod čísla 18EA z šestnáctkové do desítkové soustavy:

1 * 1000 + 8 * 100 + E * 10 + A * 1 = 18EA

1 * 4096 + 8 * 256 + 14 * 16 + 10 * 1 = 6378

1 * 163 + 8 * 162 + 14 * 161 + 10 * 160 = 6378

Implementace

V prvním vstupu zadáme programu libovolné číslo, např. 18EA. Ve druhém vstupu zadáme základ soustavy zadaného čísla, tedy v tomto případě zadáme 16:

Console.WriteLine("Zadejte číslo:");
string cislo = Console.ReadLine().ToUpper();

Console.WriteLine("Zadejte základ soustavy čísla, které jste zadali:");
int zakladSoustavy = int.Parse(Console.ReadLine());

int vysledek = 0;

if (zakladSoustavy > 1 && zakladSoustavy <= 36)
{
    int pozice = 0;
    for (int i = cislo.Length - 1; i >= 0; i--)
    {
        int cifra = cislo[i] - (cislo[i] >= 'A' ? 'A' - 10 : '0');
        vysledek += cifra * (int)Math.Pow(zakladSoustavy, pozice);
        pozice++;
    }
}

Console.WriteLine("\nVýsledek: {0}", vysledek);

Výsledek v konzoli:

Konzolová aplikace
Zadejte číslo:
18EA
Zadejte základ soustavy čísla, které jste zadali:
16

Výsledek: 6378

I když implementace uvedená výše funguje, tak efektivnější způsob převodu čísel do desítkové soustavy je pomocí Hornerova schématu. Zde se využívá toho, že mnohočlen vzniklý po rozepsání čísla můžeme upravit postupným vytýkáním základu soustavy, díky čemuž lze jeho hodnotu vyhodnotit rekurzivním vztahem. Více se o Hornerově schématu a jeho implementaci dočtete v článku na toto téma.

Převod čísel mezi libovolnými soustavami

Mezi libovolnými soustavami, tedy např. z trojkové do osmičkové, poté převádíme tak, že původní číslo nejprve převedeme do desítkové soustavy a to následně převedeme do soustavy nové.

Implementace

V prvním vstupu zadáme programu libovolné číslo, např. 10110. Ve druhém vstupu zadáme základ soustavy zadaného čísla, tedy v tomto případě zadáme 2. V posledním vstupu zadáme základ soustavy, do které chceme zadané číslo převést, např. 16:

Console.WriteLine("Zadejte číslo:");
string cislo = Console.ReadLine().ToUpper();

Console.WriteLine("Zadejte základ soustavy čísla, které jste zadali:");
int zakladSoustavy = int.Parse(Console.ReadLine());

Console.WriteLine("Zadejte základ soustavy, do které chcete číslo převést:");
int zakladCiloveSoustavy = int.Parse(Console.ReadLine());

string znaky = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int vysledekVdesitkove = 0;

if (zakladSoustavy > 1 && zakladSoustavy <= znaky.Length)
{
    int pozice = 0;
    for (int i = cislo.Length - 1; i >= 0; i--)
    {
        int cifra = cislo[i] - (cislo[i] >= 'A' ? 'A' - 10 : '0');
        vysledekVdesitkove += cifra * (int)Math.Pow(zakladSoustavy, pozice);
        pozice++;
    }
}

string obracenyVysledek = "";
string vysledek = "";
int mezivysledek = vysledekVdesitkove;

if (zakladCiloveSoustavy > 1 && zakladCiloveSoustavy <= znaky.Length)
{
    do
    {
        int zbytek = mezivysledek % zakladCiloveSoustavy;
        mezivysledek /= zakladCiloveSoustavy;
        obracenyVysledek += znaky[zbytek];
    }
    while (mezivysledek != 0);

    for (int i = obracenyVysledek.Length - 1; i >= 0; i--)
        vysledek += obracenyVysledek[i];
}

Console.WriteLine("\nVýsledek: {0}", vysledek);

Výsledek v konzoli:

Konzolová aplikace
Zadejte číslo:
10110
Zadejte základ soustavy čísla, které jste zadali:
2
Zadejte základ soustavy, do které chcete číslo převést:
16

Výsledek: 16

V další lekci, Hornerovo schéma, si ukážeme Hornerovo schéma.


 

Předchozí článek
Výpočet řešení kvadratické rovnice
Všechny články v sekci
Matematické algoritmy
Přeskočit článek
(nedoporučujeme)
Hornerovo schéma
Článek pro vás napsal Radek Vymětalík
Avatar
Uživatelské hodnocení:
1 hlasů
...
Aktivity

 

 

Komentáře

Avatar
Petr Laštovička
Super redaktor
Avatar
Petr Laštovička:4. června 19:18

Místo funkce znaky.IndexOf(cislo[i]) by bylo rychlejší použít výraz (cislo[i] - (cislo[i] >= 'A' ? 'A' - 10 : '0')).

 
Odpovědět
4. června 19:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.