Tehty Lamer's tutorialia varten
Teemu 'Brainless' Keinosen
toimesta vuonna 1997 20. päivä maaliskuuta.
Laelliset näkökohdat:
Minä, tämän dokumentin kirjoittaja, en ota minkäänlaista vastuuta
siitä, mita tämä teksti on aiheuttanut, välillisesti tai välittömästi,
sinulle tai kenellekkään muulle, tai yleensäkkään millekkään.
Paska homma, mutta maailma on julma.
Itse tutoriaali:
1. Muut lukujärjestelmät
2. Bittioperaatiot
3. 'lookup tables'
4. Jälkilöpinät
┌┐
└──────────────────────────────────────────────────────────────────────┐
└┘
1. Muut lukujärjestelmät
Olemme tottuneet laskemaan 10-järjestelmällä luultavasti johtuen
siitä, että meillä on kymmenen sormea.
Mutta on muitakin lukujärjestelmiä, esimerkiksi oktaali ja
heksadesimaalijärjestelmät.
Tässä luvussa me tarkastelemme muita lukujärjestelmiä, ja eritoten
binäärijärjestelmää.
Tietokone osaa käsitellä vain ykkösiä ja nollia, eli se käyttää
binäärijärjestelmää. Tällä järjestelmällä on kymmenjärjestelmään
vain yksi mainittava ero: se käyttää kahta merkkiä kymmenen asemasta.
Tässä pieni esimerkki:
binääri │ kymmenjärj.
─────────────┼───────────────
1 │ 1
10 │ 2
100 │ 4
1000 │ 8
10 000 │ 16
100 000 │ 32
Havainnollistan nyt muutamaa muuta lukujärjestelmää samalla luvulla
x, jonka arvo olkoot 27 kymmenjärjestelmässä:
x Binäärisenä 11011
x Oktaalijärjestelmässä 33
x Heksadesimaalijärjestelmässä 1B
Bittejen käsittely on kuitenkin aika vaikeaa, ja siksi käytetään
järjestelmiä, jotka helpottavat työtä. Oktaalijärjestelmä on yksi
tällainen, mutta se ei ole järin käytännöllinen siitä yksinkertaisesta
syystä, että teitokone käyttää bittimääriä, jotka kaikki ovat
jaollisia neljällä, eivätkä kolmella.
oktaali │ binääri
────────┼────────
1 │ 1
2 │ 10
3 │ 11
4 │ 100
5 │ 101
6 │ 110
7 │ 111
Paljon parempi järjestelmä on heksadesimaalijärjestelmä, joka
perustuu lukuun kuusitoista, joka on aikaansaatavissa neljällä
bitillä. Tällä tavalla bittejä on helppo käsitellä, koska yksi
heksa korvaa aina neljä bittiä, ja kaikki tietokoneen käsittelemät
tietomäärät ovat jaollisia neljällä.
hex │ binääri │
────────┼──────── │ 1011 0110 1100 0000
1 │ 1 │ ──┬─ ──┬─ ──┬─ ──┬─
2 │ 10 │ B 6 C 0
3 │ 11 │
4 │ 100 │ eli
5 │ 101 │
6 │ 110 │ 101101101100000
7 │ 111 │ joka on heksana
8 │ 1000 │ B6C0
9 │ 1001 │ joka on 10-järj.
A │ 1010 │ 46784
B │ 1011 │
C │ 1100 │
D │ 1101 │
E │ 1110 │
F │ 1111 │
Lukujen muuttaminen järjestelmästä toiseen on hyvä taito, vaikka
sitä ei tarvitsisikaan, ainakaan usein. Käytännössä se tapahtuu näin:
Otamme lukujärjestelmän, ja taulukon, jossa ovat potenssit
lukujärjestelmälle y, joka olkoot esimerkissä binäärinen.
potenssi │ luku
─────────┼─────
y^0 │ 1
y^1 │ 2
y^2 │ 4
y^3 │ 8
y^4 │ 16
y^5 │ 32
Dodii
Dodii, ja sitten: otamme luvun 0101 ja alamme purkamaan sitä.
Katsomme: ensimmäinen sarake: 1. Siitä tulee toimitus 2^0 * 1 = 1.
Katsomme: toinen sarake: 0. Siitä tulee toimitus 2^1 * 0 = 0.
Katsomme: kolmas sarake: 1. Siitä tulee toimitus 2^2 * 1 = 4.
Katsomme: neljäs sarake: 0. Siitä tulee toimitus 2^3 * 0 = 0.
+ -------
Ja tämä todistaa laskumme oikeiksi: 5
Toisin päin tämä on samanlaista, mutta toisinpäin.
Katsokaamme miten luku 39 muutetaan binääriksi:
Ensin otamme taulukon, jossa ovat potenssit lukujärjestelmälle y,
joka on binäärinen, eli perustuu lukuun kaksi.
potenssi │ tulo │ sarake
─────────┼──────┼────────
2^0 │ 1 │ 1
2^1 │ 2 │ 2
2^2 │ 4 │ 3
2^3 │ 8 │ 4
2^4 │ 16 │ 5
2^5 │ 32 │ 6
2^6 │ 64 │ 7
Ensin katsomme, mikä on suurin luku, johon luku 39 menee.
Se on luku 32, jonka vähennämme 39:stä ja laitamme sarakkeeseen
kuusi ykkösen.
Seuraavaksi katsomme mihin sopii luku 7, joka jäi jäljelle.
Se ei mene potenssiin neljä, joten laitamme sarakkeeseen viisi
arvon nolla.
Se ei myöskään mene sarakkeeseen neljä, joten siihenkin nolla.
Seuraava on sarake kolme, jonka potenssiarvoon luku 7 menee.
Laitamme sarakkeeseen kolme ykkösen.
Jäljellä on luku kolme, joka menee sarakkeisiin kaksi ja yksi,
värjäten ne ykkösiksi.
Sarake: 6 5 4 3 2 1
Bitti : 1 0 0 1 1 1
Luku : 39
Luvun muuttaminen esimerkiksi kymmenjärjestelmästä oktaaliksi
on muuten samanlaista, mutta katsomme jokaisen sarakkeen kohdalla
_monestiko_ luku menee kulloiseenkin potenssiin. Tämä ei ole
tarpeellista binäärijärjestelmässä sattuneesta syystä, että
järjestelmässä on vain numerot 0 ja 1.
HUOM!
────────
Kikka 10-järjestelmän luvun muuttamiseksi muihin lukujärjestelmiin:
Ota 10-järjestelmän luku x ja jaa se halutun
lukujärjestelmän kantaluvulla y. Jakojäännös laitetaan paperin
vasempaan reunaan. Summa joka on jäljellä, jaetaan taas y:llä, ja
jakojäännös laitetaan seuraavaksi oikealle viimeisimmästä jako-
jäännöksestä. Tätä jatketaan, kunnes luku katoaa.
Voitte tarkistella näitä mielenne mukaan ees ja taas ja aina tulla
samaan tulokseen, ellette ole laskeneet väärin.
┌┐
└───────────────────────────────────────────────────────────────────────┐
└┘
2. Bittioperaatiot
Tämä onkin jo paljon mielenkiintoisempi aihe, eikä niin kamalan
matemaattinenkaan. Joten luu kurkkuun ja bittioperaatioiden kimppuun.
Niitä on neljä perustyyppiä: AND, OR, XOR ja NOT. Käsittelemme
ne kaikki.
Bitin asettamisella tarkoitetaan sen asettamista todeksi (1),
ja kääntämisellä sen asettamista epätodeksi (0).
AND - bittinen JA operaatio
11110000 Asettaa bitin, jos sekä vertailun lähde JA kohde
00111100 ovat asetetut.
JA----------
00110000
OR - bittinen TAI operaatio
11110000 Asettaa bitin, jos joko toinen TAI kummatkin bitit
00111100 ovat asetetut.
TAI---------
11111100
XOR - bitittäinen poissulkeva TAI operaatio
11110000 Asettaa bitin, jos vain ja ainoastaan toinen bitti
00111100 on päällä. (oiva rekistereiden nollaamiseen)
XOR---------
11001100
NOT - bitittäinen EI operaatio
11110000 Asettaa nollatut bitit ja toisinpäin.
NOT---------
00001111
3. 'lookup tables'
Tämä on siis juttu siitä, miten aikaavievät laskutoimitukset
kannattaa laskea etukäteen, ja varastoida ne taulukkoon.
Tästä on hyötyä monissa asioissa, ei vähiten peleissä.
Otamme suoraan esimerkin C:llä:
float sin_table[270];
...
for (int a=0; a<270; a++) sin_
sin_table[a] = sin(a);
Ja sieltä niitä sitten kannatta haeskella aina tarvittaessa:
joku_luku = (sin_table[0] * cos_table[180]); // hih. ;)
Tämä nopeuttaa sovelluksia, joissa käytetään raskasta toistuvaa
matematiikkaa _hyvin_ paljon.
Se siitä. Helppo aihe.
┌┐
└──────────────────────────────────────────────────────────────────────┐
└┘
4. Loppulöpinät
Mitäpä tässä, loppu on.
Virhekorjaukset, ehdotukset, vitsit, roskan, rahan ja
flamet ja muut kivat asiat saa lähettää seuraavaan osoitteeseen:
teemu.keinonen@mbnet.fi
TAI
joonas.pihlajamaa@mbnet.fi