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