Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 2. nädala sisukord | järgmine > |
2.7 Silmaring. Arvusüsteemid
Kümnendsüsteem
Selle nädala silmaringi materjal on arvusüsteemidest. Alustame terminitest "arv" ja "number", mida paraku üsna sageli segi aetakse. Sellele lisab hoogu asjaolu, et inglise keeles on sõna "arv" vasteks just "number" ja juhtub, et tõlkides jäetakse ka eesti keeles sõnaks "number". Samuti on eesti keeles mitmeid termineid, kus "number" on kinnistunud, aga tegelikult pigem arvu tähenduses on (nt telefoni number, kinga number, passi number).
Niisiis püüdes sellest mitte liiga suurt numbrit teha, peame siiski vähemalt antud materjalis (ja tegelikult kogu sel kursusel) neil mõistetel vahet tegema.
Ajalooliselt oli arv algul loendamise tulemus. Loendades saame naturaalarvud, 1, 2, 3, 4, 5 jne. 0 võetakse mõnes kontekstis naturaalarvude hulka, mõnes mitte. Eks siin olegi mõneti filosoofiline küsimus - kas siis, kui midagi ei ole loendatud, saab üldse rääkida loendamise tulemusest! Hiljem arvude mõistet laiendati - räägiti täisarvudest, ratsionaalarvudest, reaalarvudest, kompleksarvudest. Meie jääme siin põhiliselt täisarvude juurde.
Igatahes tekkis ajalooliselt vajadus arve kirja panna. Kasutusel on olnud väga erinevaid süsteeme. Tänapäeval on kõige levinum viis panna arve kirja araabia numbrite abil. Algselt India päritolu märgid jõudsid Araabia kaudu Euroopasse. Seejuures 0 võeti teistest numbritest märgatavalt hiljem kasutusse. Numbreid on siis klassikaliselt kasutusel kümme. Need on 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Numbrid on seega sümbolid - märgid, mille abil arve kirja pannakse.
Arve, mida kirja panna tuleb, on muidugi palju rohkem kui kümme. Teoreetiliselt on neid lausa lõpmatult palju. Kui väikeste naturaalarvude puhul saame ühe numbriga arvu kirja, siis edasi peab mingit süsteemi kasutama. Nii ongi kujunenud, et lisaks numbri enda väärtusele loeb ka tema positsioon. Näiteks arvus 77 on esimese 7 tähendus tegelikult 70 ja teisel 7. Sellist süsteemi nimetatakse positsiooniliseks arvusüsteemiks. Positsioon on oluline!
Kui nüüd nt 2016 juppideks võtta saame 2016 = 2000 + 10 + 6. Näeme, et 0 on väga oluline ja näitab, et sajalisi pole. Veel detailsemalt saame, et 2016 = 2 · 103 + 0 · 102 + 1 · 101 + 6 · 100. Tähele tuleb panna, et arvu väärtuse leidmisel hakatakse tegelikult pihta paremalt. Paremalt esimene number näitab üheliste (100 = 1) arvu, teine number kümneliste (101 = 10) jne. Lühematel juhtudel näeme muidugi peale vaadates ära, mis positsioonil paremalt viimane ehk vasakult esimene number on. Pikematel juhtudel aga tulebki paremalt lugema hakata.
Ülesanne
Kuna on kasutada kümme erinevat numbrit, siis nimetatakse seda süsteemi kümnendsüsteemiks. See on tõesti laialt levinud, seejuures ka näiteks mõõtühikute (sh rahaühikute) juures. Siiski pole tegemist ainukese võimaliku arvusüsteemiga. Aegade jooksul on kasutuses olnud väga erinevad süsteemid. (Näiteks ka rahaühikute korral - Suurbritannia naelsterling jaotub 100 penniks alles alates 1971. aastast.)
Arvusüsteemid pole alati ka (puhtalt) positsioonilised olnud. Näiteks rooma numbrite puhul on positsioon küll oluline, aga mitte ülal toodud süsteemi järgi. Nüüd aga jätkame ikkagi positsiooniliste süsteemidega.
Kahendsüsteem
Võib tekkida õigustatud küsimus, et kas kümme on ainuke võimalik numbrite arv ja arvusüsteemi alus. Kas võib süsteemi üles ehitada ka vähemate numbritega või hoopis enamate? Jah, saab nii vähemate kui enamatega. Vaatleme nüüd sellist süsteemi, kus numbreid on ainult kaks: 0 ja 1. Tegemist on kahendsüsteemiga. Arvude üles kirjutamise idee on samasugune nagu kümnendsüsteemis. Esialgu saame hakkama ühe numbriga. Kui loendatavaid elemente pole, siis on neid 0 ja kui on üks, siis on 1. Rohkem aga erinevaid numbreid pole. Tekib samasugune olukord nagu kümnendsüsteemis arvu 9 puhul, mille järel enam uusi numbreid pole. Nagu kümnendsüsteemiski tuleb nüüd kasutusele kirjapilt 10, mis tähendab siis tavamõttes kahte, arvutus oleks selline: 1 · 21 + 0 · 20.
Rõhutada tuleb, et tegemist on loendamise mõttes ikka sama arvuga, lihtsalt kirjapilt on erinev. Selleks, et eristada erinevaid aluseid, märgitakse neid alaindeksitega, seega 102 = 210. Pythonis aga pannakse kahendarvudele ette 0b. Näiteks 0b10 on siis tavamõttes 2.
Toome tabeli mõningate arvudega.
Kümnendarv | Kahendarv |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
14 | 1110 |
15 | 1111 |
16 | 10000 |
31 | 11111 |
32 | 100000 |
63 | 111111 |
64 | 1000000 |
Näeme, et erinevates süsteemides on "ümmargused" hoopis erinevad arvud. Hea võimalus näiteks juubelite pidamiseks!
Kahendarvudel on praktiline väärtus just arvutitega seoses. Nimelt on kahte võimalikku seisundit palju hõlpsam realiseerida kui näiteks kümmet erinevat. Lamp põleb / ei põle. Mälupesas on midagi / ei ole. Kahendarv koosneb kahendnumbritest. Inglise keeles on kahendnumber binary digit, millest on tuletatud mõõtühiku nimeks bit. Bitt ongi informatsiooni põhiühikuks.
Kahendarvudega saab tehteid teha analoogiliselt kümnendarvudega, aga seda me siinkohal ei vaatle, mis ei takista siiski selleteemalise küsimuse esitamist.
Ülesanne
Neile, kes kahendsüsteemist väga vaimustatud on, võivad näiteks huvi pakkuda kahendsüsteemis (tegelikult küll modifitseeritud viisil) aega näitavad kellad.
Kaheksandsüsteem. Kuueteistkümnendsüsteem
Kahendarvud lähevad üsna kiiresti pikaks ja see on üks põhjus, miks kasutatakse ka kaheksandarve ja kuueteistkümnendarve. Kuna 8 ja 16 on 2 astmed, siis on konverteerimine näiteks kuueteistkümnend ja kahendsüsteemi vahel oluliselt lihtsam kui kümnendsüsteemi ja kahendsüsteemi vahel.
Kaheksandsüsteemis saab ikka tavalisi numbreid kasutada - lihtsalt 8 ja 9 jäävad kasutamata. Kuueteistkümmendsüsteemis aga kümnest märgist ei piisa. Spetsiaalseid numbreid pole siiski juurde mõeldud, kasutatakse tähti A, B, C, D, E ja F.
Lisamegi nüüd eelmisele tabelile kaheksandarvude ja kuueteistkümnendarvude veerud.
Kümnendarv | Kahendarv | Kaheksandarv | Kuueteistkümnendarv |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
31 | 11111 | 37 | 1F |
32 | 100000 | 40 | 20 |
63 | 111111 | 77 | 3F |
64 | 1000000 | 100 | 40 |
Kuidas siis mõista kaheksandarvu 137? Nüüd on siis aluseks 8, mis tähendab, et
1378 = 1 · 82 + 3 · 81 + 7 · 80 = 64 + 24 + 7 = 95
Vaatleme ka kahte kuueteistkümnendarvu. Neis võivad numbritena olla tähed tähestiku algusest, aga ei pruugi olla. Näiteks arvestades, et A on kümnendsüsteemi 10 ja D on 13, saame
A2D16 = 10 · 162 + 2 · 161 + 13 · 160 = 2560 + 32 + 13 = 2605
ja
101016 = 1 · 163 + 0 · 162 + 1 · 161 + 0 · 160 = 4096 + 16 = 4112.
Pythonis on kaheksandsüsteemis arvu märkimiseks kasutusel prefiks (eesliide) 0o ja kuueteistkümnendarvude jaoks 0x.
Kuueteistkümnendarve kasutatakse sageli näiteks mäluaadressides ja ka näiteks värvide märkimiseks.
Erinevate värvide kuueteistkümnend koode saab vaadata siit. Neid saame ka kilpkonnagraafikas kasutada. Näiteks
turtle.pencolor('#85e085')
mõjul muutub kilpkonna sule heleroheliseks.
Kaheksandsüsteemi arve kasutatakse näiteks mõnedes operatsioonisüsteemides failidele juurdepääsu õiguste määramiseks. Näiteks Unixis annab chmod 664 mingifail.txt
kasutajale ja rühmale õiguse lugeda ja kirjutada, aga mitte käivitada. Teised saavad ainult õiguse lugeda.
Ülesanne
Veel lugemist
Ise saate arve erinevate alustega süsteemidesse konverteerida näiteks siin või ka siin.
Nagu paljudest muudest asjadestki on arvusüsteemidest juttu "Matemaatika õhtuõpikus", mille saab ka alla laadida.
< eelmine | 2. nädala sisukord | järgmine > |