Lukujärjestelmämuunnokset
Kirjoittaessamme ohjelmia mikrokontrollereille joudumme yleensä käsittelemään kolmea erilaista lukujärjestelmää: desimaali-, binääri- ja heksadesimaalijärjestelmää (tai heksan). Käytämme desimaalijärjestelmää, koska se on meille luonnollinen tapa laskea. Valitettavasti tietokoneet eivät laske sillä tavalla. Koska tietokoneet ja mikrokontrollerit voivat käyttää vain ykkösiä ja nollia, ne laskevat käyttämällä näiden numeroiden sarjoja. Tämä on binäärilukujärjestelmä. Binäärilukuja edeltää yleensä ’0b’-merkki, joka ei ole osa lukua. Joskus ne on myös jaettu neljän numeron ryhmiin, jotta niitä olisi helpompi lukea ja jotta niitä olisi helpompi verrata heksadesimaalilukujärjestelmään. Esimerkki binääriluvusta on 0b0100.1011. Numerossa olevat pisteet eivät merkitse mitään, ne vain helpottavat numeron lukemista.
Binäärijärjestelmä on yksinkertainen ymmärtää, mutta tarvitaan paljon numeroita, jotta binäärijärjestelmän avulla voidaan esittää suuria lukuja. Heksadesimaalijärjestelmässä voidaan esittää paljon suurempia lukuja käyttämällä vähemmän merkkejä, ja se muistuttaa läheisesti binäärilukuja. Heksadesimaalilukuihin liitetään yleensä merkit ”0x”, jotka eivät ole osa lukua. Yksi heksadesimaaliluku voi edustaa neljää binäärilukua!
Binääriluvut voivat koostua vain 1:stä ja 0:sta; tyypillisesti binääriluku koostuu 8:sta numerosta (tai jostain 8:n kerrannaisesta), jos sitä käytetään jossakin tietokoneessa (tai mikrokontrollerissa). On hyödyllistä tietää, miten binääriluku muunnetaan desimaaliluvuksi ja päinvastoin. Miten siis muunnetaan lukujärjestelmien välillä? Mieti ensin, miten määritämme desimaaliluvun arvon. Luku 268 voidaan jakaa muotoon 200 + 60 + 8 tai 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Meidän on tiedettävä kaksi tärkeää lukua, jotta voimme ”purkaa” luvun – lukujärjestelmän perusta ja numeron sijainti luvun sisällä. Desimaaliluvun perusta on 10. Kun muunnamme lukua 268, 2 on toinen numero, 6 on ensimmäinen numero ja 8 on nollanumero. Jokainen numero on skaalattava sen mukaan, mikä on sen paikka luvussa. Numeron asteikko on lukujärjestelmän perusta korotettuna numeron sijainnin potenssiin luvussa. Jokainen luku skaalataan siis, ja sitten kaikki skaalatut numerot lasketaan yhteen, jotta saadaan luvun kokonaisarvo.
Samaa menetelmää voidaan käyttää binääriluvun arvon määrittämiseen. Tarkastellaan esimerkiksi lukua 0b1011.0101. Binäärijärjestelmän perusta on 2 (etuliitettä 0b käytetään usein koodissa osoittamaan, että luku on binäärimuodossa). Luvun arvo on: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), joka on yhtä kuin 181.
0b1011.0101. Täysin tehoton tapa kirjoittaa luku! Voimme kuitenkin esittää saman binääriluvun käyttämällä vain kahta heksadesimaalilukua. Aloitamme kuitenkin ensin muuntamalla heksadesimaaliluvun desimaaliluvuksi, kuten teimme binääriluvun kohdalla. Miten olisi 0xB5? Odota, mitä?! Etuliitettä 0x käytetään koodissa osoittamaan, että luku kirjoitetaan heksadesimaalina. Mutta mitä ’B’ tekee siinä? Heksadesimaalimuodossa on 16:n perusta, mikä tarkoittaa, että jokainen numero voi edustaa enintään 16 eri arvoa. Valitettavasti numeronumerot loppuvat 9:n jälkeen, joten alamme käyttää kirjaimia. Kirjain ”A” on 10, ”B” on 11, ”C” on 12, ”D” on 13, ”E” on 14 ja ”F” on 15. F on suurin numero heksanumerojärjestelmässä. Muunnamme luvun samalla tavalla kuin aiemmin. 0xB5:n arvo on siis: B*(16^1)+5*(16^0) eli 181.
Tietäminen siitä, miten binääri- ja heksamuunnos muunnetaan desimaaliluvuksi, on tärkeää, mutta hyödyllisin numeromuunnos on luultavasti heksan ja binäärin välinen muunnos. Nämä kaksi numerointijärjestelmää toimivat itse asiassa melko hyvin yhdessä. Numerointijärjestelmät sattuvat liittymään toisiinsa siten, että yksi heksanumero vastaa tasan neljää binäärinumeroa, joten kaksi heksanumeroa voi vastata kahdeksaa bittiä (tai binäärinumeroa). Seuraavassa taulukossa esitetään, miten kukin heksaluku liittyy binäärijärjestelmään:
Binary Value | Hex Value |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |