Teisendamine teiste arvusüsteemide vahel¶
Kuigi eelnevalt tõime näited kahendsüsteemi teisendamise kohta, siis analoogselt toimuks loogika ka muude arvusüsteemi jaoks.
Näiteks kaheksandsüsteemi puhul:
Teisendame 155
kaheksandsüsteemist kümnendsüsteemi:
\((155)_8 = 1 \cdot 8^2 + 5 \cdot 8^1 + 5 \cdot 8^0 = 1 \cdot 64 + 5 \cdot 8 + 5 = (109)_{10}\)
Ja teisendame 234
kümnendsüsteemist kaheksandsüsteemi:
234 : 8 = 29 jääk 2
29 : 8 = 3 jääk 5
3 : 8 = 0 jääk 3
Ehk siis \((234)_{10} = (352)_8\)
Teisendamine 10nd arvuks
Kirjeldame siin üldist protsessi, kuidas saab suvalisest arvusüsteemist teisendada arvu kümnendsüsteemi.
Esimese asjana on meil vaja teada algse arvusüsteemi sümbolite väärtusi kümnendsüsteemis. Kui näiteks algne arv on kuueteistkümnendsüsteemis, siis seal ühel positsioonil võib olla 16 erinevat väärtust. Araabia numbritega saab tähistada vaid 10 erinevat väärtust. Seega kasutatakse 16ndsüsteemis lisaks sümboleid ABCDEF
(tähistavad vastavalt väärtusi 10 - 15).
Võtame järjest sümboleid sisendarvust. Teisendame sümboli 10ndsüsteemi. Korrutame saadud väärtuse järguga läbi. Järgu jaoks arvestame positsiooni ja alust. Näiteks kolmekohalise 16ndsüsteemi arvu puhul esimese arvu kohakaal on \(16^2\), teise arvu oma \(16^1\) jne. Iga sisendsümboli jaoks saadud väärtuse ja kohakaalu korrutised liidame. Tulemuseks on väärtus kümnendsüsteemis.
Pseudokood võiks olla järgnev:
sümbolid = "0123456789ABCDEF"
tulemus = 0
iga sümboli jaoks sisendarvus tee järgnevat:
sümboli väärtus = sümboli positsioon sümbolite seas
väärtus = sümboli väärtus * (alus ^ (sisenarvu pikkus - antud sümboli positsioon sisendarvus - 1))
tulemus = tulemus + väärtus
Pythonis võiks see välja näha nii:
symbols = "0123456789ABCDEF"
def base_to_dec(value: str, base: int) -> int:
number = 0
for i, symbol in enumerate(value):
number += symbols.index(symbol) * base ** (len(value) - i - 1)
return number
Funktsiooni saab kasutada järgnevalt:
print(base_to_dec("1101", 2)) # 13
Pythonis on sama võimalik saavutada ka int()
funktsiooniga. Selle funktsiooni puhul teise argumendina saab kaasa anda arvusüsteemi, milles esimese argumendina kaasa antud arv on esitatud.
print(int("1101", 2)) # 13
print(int("FF", 16)) # 255
10nd arvu teisendamine teise arvusüsteemi
Selleks, et 10ndarvu teisendada teise arvusüsteemi, peame samamoodi teadma teise arvusüsteemi sümboleid.
Protsess teisendamiseks on järgmine:
Leiame 10ndarvu jäägi baasiga - vastav element sümbolite hulgast läheb tulemusse
Jagame 10ndarvu baasiga läbi (võtame täisosa) ja kordame protsessi
Protsessi korratakse, kuni 10ndarv on suurem kui 0.
Tulemus on nüüd tagurpidi ja on vaja ringi pöörata.
Pseudokood võiks olla järgmine:
sümbolid = "0123456789ABCDEF"
tulemus = ""
arv = sisendarv
korda:
jääk = arv % alus
tulemus = tulemus + sümbolite seast jäägi positsioon
arv = täisosa(arv / alus)
kui arv == 0: lõpeta kordamine
tulemus = tulemus tagurpidi
Pythoni võimalik lahendus:
symbols = "0123456789ABCDEF"
def dec_to_base(number: int, base: int) -> str:
result = ""
while True:
result += symbols[number % base]
number = number // base
if number == 0:
break
return result[::-1]
Seda saab kasutada järgnevalt:
print(dec_to_base(255, 16)) # FF
Näidetes on arvestatud vaid arvusüsteemidega, milles on kuni 16 sümbolit. Selleks, et kood töötaks ka suuremate alustega, on vaja sümbolite hulka täiendada.