Positsioonilised arvusüsteemid

Kasutame igapäevaselt arvude väljendamiseks kümnendsüsteemi. See tähendab, et kõik arvud esitatakse kümne erineva numbriga (0, 1, ..., 9). Kümnendsüsteem on positsiooniline arvusüsteem. Positsioonilises arvusüsteemis sõltub numbri väärtus tema positsioonist ehk asukohast arvus. Vaatame näidet: 121. Kuigi selles arvus on nii esimene kui ka viimane number üks (1), siis ometigi on nende väärtused erinevad: esimene tähistab sadat (100), viimane tähistab ühte (1).

Kümnendsüsteem

Kümnendsüsteemis kasutatakse araabia numbreid 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Kokku on erinevaid numbreid 10. Numbrimärkide arv tähsitab arvusüsteemi alust. Kümnendsüsteemi puhul on alus 10.

Vaatame näidet, kuidas arvutatakse arvu väärtus kümnendsüsteemis: \(523 = 5 * 10^2 + 2 * 10^1 + 3 * 10^0\).

Kui eelnevas näites kirjutada numbrid teises järjekorras, on tulemus (arvu väärtus) teine.

Võime kümnendsüsteemi jaoks teha üldistuse: kui arv koosneb n numbrist \(a_{n-1}\,a_{n-2}\dotsc\,a_1\,a_0\), siis selle väärtus kümnendsüsteemis on \(a_{n-1}\cdot10^{n-1} + a_{n-2}\cdot10^{n-2} + \dotsc + a_1\cdot10^1 + a_0\cdot10^0\)

Tegelikult kehtib see samamoodi ka reaalarvude kohta. Murdosa jaoks muutuvad astmed negatiivseks. Olgu murdosa esitatud arvudega \(a_{-1}\) kuni \(a_{-m}\):

\(a_{n-1}\,a_{n-2}\dotsc\,a_1\,a_0\,a_{-1}\dotsc\,a_{-m}\), selle väärtus kümnendsüsteemis on \(a_{n-1}\cdot10^{n-1} + a_{n-2}\cdot10^{n-2} + \dotsc + a_1\cdot10^1 + a_0\cdot10^0 + a_{-1}\cdot10^{-1} + \dotsc + a_{-m}\cdot10^{-m}\)

Näiteks: \(66,34 = 6 \cdot 10^1 + 6 \cdot 10^0 + 3 \cdot 10^{-1} + 4 \cdot 10^{-2}\)

Kahendsüsteem

Kahendsüsteemi peamiseks kasutusalaks on arvutid. Kahendsüsteemis esitatakse arve sarnaselt kümnendsüsteemiga. Vahe on selles, et kümne numbrimärgi asemel kasutatakse kahte: 0 ja 1. Kohakaalud on kahe astmed (ehk siis kahendsüsteemi puhul on alus 2).

\(10011 = 1 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0\)

Arvu suurust mõtleme kümnendsüsteemis, selle arvu väärtus on 11: \((1011)_2 = (19)_{10}\)

Teisendamise näited

Kahendarvu teisendamine kümnendarvuks

\((10011)_2 = 1 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 = 16 + 2 + 1 = (19)_{10}\)

Kümnendarvuks teisendamisel summeerime iga numbri korrutise vastava kohakaaluga. Kui teisendame kahendsüsteemist, siis kohakaal on kahe aste. Kui kahendarvu pikkus on n, siis esimene korrutis on esimese numbri väärtus (kas 1 või 0) korda \(2^{n-1}\). Teine korrutis on teise numbri väärtus korda \(2^{n-2}\). Eelviimane ja viimane korrutis on vastavalt eelviimase numbri väärtust korda \(2^1\) ja viimase numbri väärtus korda \(2^0\).

10nd arvu teisendamine kahendarvuks

Teisendamiseks hakkame arvu jagama kahega ning jäägid annavad tulemuse kahendsüsteemis.

Näiteks leiame kümnendarvu 25 esituse kahendsüsteemis:

25 : 2 = 12   jääk 1
12 : 2 = 6    jääk 0
6  : 2 = 3    jääk 0
3  : 2 = 1    jääk 1
1  : 2 = 0    jääk 1

Jääkidest loeme välja tulemuse (altpoolt üles): \((25)_{10} = (11001)_2\)

Siia võib võrdluseks tuua kümnendarvu leidmise:

1234 : 10 = 123   jääk 4
123  : 10 = 12    jääk 3
12   : 10 = 1     jääk 2
1    : 10 = 0     jääk 1

Siin loeme samamodi tulemuse jääkidest altpoolt üles: 1234.

Arvutusnäidetes toimub jagamine alusega (eelnevalt kas 2 või 10). Tulemus on täisosa, jäägi märgime eraldi. Täisosast arvutame omakorda järgmisel real omakorda jagatuse ja jäägi. Seda tegevust kordame, kuni tulemus on 0. Tulemuse loeme jääkidest altpoolt üles.

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.