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
:
{CSHARP_CONSOLE}
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);
{/CSHARP_CONSOLE}
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
:
{CSHARP_CONSOLE}
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);
{/CSHARP_CONSOLE}
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
:
{CSHARP_CONSOLE}
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);
{/CSHARP_CONSOLE}
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