IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

12. diel - Prevod čísel medzi číselnými sústavami

Číselná sústava je spôsob zápisu číselných hodnôt pomocou vopred dané množiny znakov. Každý znak reprezentuje nejakú konkrétnu číselnú hodnotu. Ak chceme vyjadriť číselnú hodnotu, ktoré nezodpovedá žiadny znak z danej množiny, tak musíme použiť kombináciu týchto znakov.

Vyššia sústavy, ktorým nestačí číslice 0-9, používajú pre doplnenie znakov písmená anglickej abecedy.

Číselných sústav existuje nepreberné množstvo. V bežnom živote sa najčastejšie stretávame s desiatkovú sústavou, ktorá pre zápis čísel používa desať znakov (číslic 0-9). Vo svete počítačov sa však ujala dvojková sústava, pretože čísla sa v nej dajú jednoducho vyjadriť pomocou dvoch hodnôt elektrického napätia. Ďalej sa tiež môžeme stretnúť sa šestnástkovom sústavou využívajúce číslice 0-9 a prvých šesť písmen anglickej abecedy (AF), ktorá sa používa napr. Pre kódy farieb. Preto sa nám niekedy môže hodiť vedieť čísla medzi sústavami prevádzať.

Prevod čísel z desiatkovej sústavy

Pre prevod čísel z desiatkovej sústavy sa používa algoritmus využívajúci zvyškov po delení základom požadované sústavy (pre dvojkovú sústavu je to číslo 2, pre šestnástkovom 16 atď.).

Prevádzané číslo vydelíme základom požadovanej sústavy, zapíšeme si zvyšok do reťazca a výsledok delenia si uložíme. Ďalej už delíme výsledok predchádzajúceho delenie a celý proces opakujeme, až dôjdeme k výsledku 0. Výsledným číslom v požadovanej sústave je reťazec zvyškov po delení v obrátenom poradí.

Ukážme si to na prevode čísla 13 do dvojkovej sústavy:

13/2 = 6 zvyšok 1 .<>
6/2 = 3 zvyšok 0 .<>
3/2 = 1 zvyšok 1 .<>
1/2 = 0 zvyšok 1

Výsledné číslo sú zvyšky prečítané od spodu nahor, teda 1101.

Prevod čísla 12 napr. Do třináctkové sústavy by vyzeral nasledovne:

12/13 = 0 zvyšok 12

Výsledné číslo sú opäť zvyšky prečítané od spodu nahor. Tu máme len jediný zvyšok, a to číslo 12. Táto 12 je však stále v desiatkovej sústave, musíme ju previesť do třináctkové. Třináctková sústava využíva číslice 0-9 a prvé tri písmená anglickej abecedy (AC). Vo třináctkové sústave sa teda číslo 12 zapíše ako C. Číslo 13 v desiatkovej sústave by sa potom vo třináctkové zapísalo ako 10:

13/13 = 1 zvyšok 0 .<>
1/13 = 0 zvyšok 1

Implementácia

V prvom vstupe zadáme programu ľubovoľné číslo v desiatkovej sústave, napr. 13. V druhom vstupe zadáme základ sústavy, do ktorej chceme zadané číslo previesť, napr. Do dvojkovej, zadáme 2:

Console.WriteLine("Zadajte číslo v desiatkovej sústave:");
int cislo = int.Parse(Console.ReadLine());

Console.WriteLine("Zadajte základ sústavy, do ktorej chcete previesť:");
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ýsledok: {0}",vysledek);

Výsledok v konzole:

Konzolová aplikácia
Zadajte číslo v desiatkovej sústave:
13
Zadajte základ sústavy, do ktorej chcete previesť:
2

Výsledok: 1101

Prevod čísel do desiatkovej sústavy

Pre prevod čísel do desiatkovej sústavy sa využíva toho, že každá cifra čísla predstavuje hodnotu určitého číselného poriadku.

Ukážme si to na čísle 6308 v desiatkovej sústave. Toto číslo sa skladá zo 6 tisícov (10 3), 3 stoviek (10 2), 0 desiatok (10 1) a 8 jednotiek (10 0). Mohli by sme ho teda rozložiť na tento mnohočlen:

6 * 10 3 + 3 * 10 2 + 0 * 10 1 + 8 * 10 0 .<>
6 * 1000 + 3 * 100 + 0 * 10 + 8 * 1

Prvý číslicu sprava násobíme nultú mocninou desiatky, druhou prvý mocninou desiatky, tretí druhou mocninou desiatky atď.

Úplne rovnako to funguje aj v ostatných sústavách. Tu však jednotlivé poriadky nie sú mocniny desiatky, ale mocniny základu danej sústavy. Napríklad číslo 10110 v dvojkovej sústave sa dá rozpísať na tento mnohočlen:

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

Čísla 10000, 1000, 100 a 10 sú tu v dvojkovej sústave.

V prípade, že všetky čísla mnohočlena prevedieme do desiatkovej sústavy a mnohočlen spočítame, tak získame dané číslo v desiatkovej sústave:

1 * 16 + 0 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 22 .<>
1 * 2 4 + 0 * 2 3 + 1 * 2 2 + 1 * 2 1 + 0 * 2 0 = 22

Ukážme si ešte prevod čísla 18EA z šestnástkovej do desiatkovej sústavy:

1 * 1000 + 8 * 100 + E * 10 + A * 1 = 18EA .<>
1 * 4096 + 8 * 256 + 14 * 16 + 10 * 1 = 6378 .<>
1 * 16 3 + 8 * 16 2 + 14 * 16 1 + 10 * 16 0 = 6378

Implementácia

V prvom vstupe zadáme programu ľubovoľné číslo, napr. 18EA. V druhom vstupe zadáme základ sústavy zadaného čísla, teda v tomto prípade zadáme 16:

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

Console.WriteLine("Zadajte základ sústavy čísla, ktoré ste zadali:");
int zakladSoustavy = int.Parse(Console.ReadLine());

string znaky = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int vysledek = 0;

if (zakladSoustavy > 1 && zakladSoustavy <= znaky.Length)
{
    int pozice = 0;
    for (int i = cislo.Length - 1; i >= 0; i--)
    {
        int cifra = znaky.IndexOf(cislo[i]);
        vysledek += cifra * (int)Math.Pow(zakladSoustavy, pozice);
        pozice++;
    }
}

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

Výsledok v konzole:

Konzolová aplikácia
Zadajte číslo:
18EA
Zadajte základ sústavy čísla, ktoré ste zadali:
16

Výsledok: 6378

Aj keď implementácia uvedená vyššie funguje, tak efektívnejší spôsob prevodu čísel do desiatkovej sústavy je pomocou Hornerovho schémy. Tu sa využíva toho, že mnohočlen vzniknutý po rozpisu čísla môžeme upraviť postupným vytýkáním základu sústavy, vďaka čomu možno jeho hodnotu vyhodnotiť rekurzívne vzťahom. Viac sa o Hornerovho schéme a jeho implementáciu dočítate v článku na túto tému.

Prevod čísel medzi ľubovoľnými sústavami

Medzi ľubovoľnými sústavami, teda napr. Z trojkového do osmičkovej, potom prevádzame tak, že pôvodné číslo najprv prevedieme do desiatkovej sústavy a to následne prevedieme do sústavy novej.

Implementácia

V prvom vstupe zadáme programu ľubovoľné číslo, napr. 10110. V druhom vstupe zadáme základ sústavy zadaného čísla, teda v tomto prípade zadáme 2. V poslednom vstupe zadáme základ sústavy, do ktorej chceme zadané číslo previesť, napr. 16:

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

Console.WriteLine("Zadajte základ sústavy čísla, ktoré ste zadali:");
int zakladSoustavy = int.Parse(Console.ReadLine());

Console.WriteLine("Zadajte základ sústavy, do ktorej chcete číslo previesť:");
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 = znaky.IndexOf(cislo[i]);
        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ýsledok: {0}", vysledek);

Výsledok v konzole:

Konzolová aplikácia
Zadajte číslo:
10110
Zadajte základ sústavy čísla, ktoré ste zadali:
2
Zadajte základ sústavy, do ktorej chcete číslo konvertovať:
16

Výsledok: 16

 

Všetky články v sekcii
Matematické algoritmy
Článok pre vás napísal Radek Vymětalík
Avatar
Užívateľské hodnotenie:
3 hlasov
...
Aktivity