Accendo / Publikované

Prekladáme číslo do desiatkovej sústavy

Autor: Libor Bešenyi

            Teraz, keď by sme mali vedieť teoreticky i prakticky každé číslo desiatkovej sústavy previesť do inej sústavy pozrime sa, ako sa to dá jednoducho aj opačne. Znova začneme s binárnou sústavou a budeme sa snažiť postupne zautomatizovať prevody.

            Takže, zoberme si trebárs číslo 101001100 binárnej sústavy. Očíslujme si sprava doľava čísla indexom od nula po n-1, kde n je počet cifier. Teda naše číslo očíslujeme 0,1,...,8 teda skôr 8,7,...0. A jednoducho zoberme číslo z nultého indexu a vynásobme ho dvojkou (lebo pracujeme s binárnou sústavou), ktorú umocníme na daný index a vytvorme sumu týchto indexov. Je to opäť jednoduchšie ako sa zdá:

 

            V podstate je zbytočné rátať tam kde je na indexe binárneho čísla nula, pretože nula krát hocičo dáva stále nulu. Netreba však zabúdať, že keby na konci binárneho čísla bola jednotka tak 1x20 (v počítačovom svete sa budeme stretávať so zápisom 1*2^0, kde hviezdička je násobenie a strieška značí mocninu) je 1 pretože hocičo na nultú je 1! Teda na uľahčenie prevodu z binárnej sústavy si môžeme urobiť ekvivalentnú tabuľku s tým, že do nej pridáme ešte jeden riadok. Mocniny dvoch sú chronicky známe všetkým  prívržencom počítačov a tak sa šikovne vypíšu pod indexy, ktoré udávajú mocninu dvojky na daný index, teda pod nulou bude spomínaná jednotka a pokračujeme: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 ... a potom zakrúžkujeme stĺpce podľa binárneho čísla, kde sa nachádza jednotka a dolné mocniny spočítame:

 

 

            Ak chceme však prevádzať čísla z rôznych sústav, oplatí sa radšej prvý spôsob, ktorý je prehľadnejší pre kontrolu apod. Takže sa pozrime na osmičkovú sústavu. Majme číslo (564711 )8 a chceme ho previesť do desiatkovej. Postupujeme analogicky ako v prvom prípade, urobíme si tabuľku a postupne budeme spočítavať a násobiť atď. Tentoraz základom 8! Takže:

 

5

6

4

7

1

1

5

4

3

2

1

0

 

1*8^0 + 1*8^1 + 7*8^2 + 4*8^3 + 6*8^4 + 5*8^5 =

1*1 + 1*8 + 7*64 + 4*512 + 6*4.096 + 5*32.768 =

1 + 8 + 448 + 2048 + 24.576 + 163.840=

190.921

 

            V hexadecimálnej sústave hádam ani nemusíme ukazovať, ale pre istotu. Zoberme si číslo A5F9 a preveďme ho späť do „čitateľnej“ desiatkovej sústavy:

 

A

5

F

9

3

2

1

0

 

9*16^0 + F*16^1 + 5*16^2 + A*16^3 =

9*1 + 16*15 + 5*256 + 10*4.096 =

9 + 240 + 1.280 + 40.960 =

42.489

 

            Myslím, že nebudeme mať problém vytvoriť univerzálny vzorec na prevod do desiatkovej sústavy. Ak s bude číselná sústava, X číslo v nej zadané a n počet cifier zadefinujeme prevod podľa horných príkladov takto:

 

X1*s^0 + X2*s^1 + … Xn*16^(n-1)

 

            Teraz to prepíšme tak, aby to chápal aj počítač. Ako sme si isto všimli pracujeme s mocninami vyššieho exponentu ako dva. A keďže pascal ponúka mocninu len dvoch, funkciu „na n-tú“ si budeme musieť vytvoriť sami. Index „pohybu“ budeme rátať ako index reťazca čísla – keďže číslo ako A5F6 sa na vstupe musí zadávať do stringu, čo iste každého napadlo. To všetko budeme pripočítavať ku výsledku – tzv. inkrementácia – A:=A+x; alebo Inc(A,X). Musíme však rozdeľovať číslice a písmená, ako si môžeme všimnúť z posledného príkladu v druhom riadku výpočtu sme automaticky dopĺňali namiesto písmen ich desiatkovú hodnotu! Tento výpočet musí program taktiež zvládať a opäť je tu niekoľko možností ako to zabezpečiť. Ja som si znova zvolil preratávanie z oridnálnej tabuľky – načo vytvárať niečo, keď to už existuje, že? Tak a tu je výsledný kód:

 

Function Mocni(Co:Integer;Na:Byte): Longint;

var Pom: Longint;

I: Integer;

begin

If Na=0 then Pom:=1 else Pom:=Co;

If Na>1 then For I:=2 to Na do Pom:=Pom*Co;

Mocni:=Pom;

end;

 

Function StrToInt(S: String):Longint;

var i,C: Integer;

begin

Val(S,I,C); StrToInt:=I;

end;

 

var I,Sustava: Integer;

Cislo: String;

Vysledok: Longint;

begin

Vysledok:=0;

Write('Zadaj ciselnu sustavu: '); Readln(Sustava);

Write('Zadaj cislo: '); Readln(Cislo);

For I:=Length(Cislo) downto 1 do

case UpCase(Cislo[I]) of

'0'..'9': Inc(Vysledok,Mocni(Sustava,Length(Cislo)-I)*StrToInt(Cislo[I]));

'A'..'Z': Inc(Vysledok,Mocni(Sustava,Length(Cislo)-I)*(10+Ord(UpCase(Cislo[I]))-65));

end;

Writeln('V desiatkovej sustave = ',Vysledok);

end.

 

Pozor: Metóda, ktorá tu bola prezentovaná platí len pre kladné čísla a celé. Napr. aj v binárnej sústave môžeme zobraziť desatine čísla, ale s týmto sa začínajúci programátor nestretne...

 

Príloha