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.