Metropoli BBS
VIEWER: luvut.txt MODE: TEXT (CP437)
                      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
[ RETURN TO DIRECTORY ]