Skip to content

Talnakerfi

Áður en við ræðum um gögn er vert að kafa aðeins betur ofan í tölur, sér í lagi talnakerfi (number systems). Af hverju? Hvernig tengjast gögn eins og bækur, myndir, vídeó og tónlist tölum? Þegar öllu er á botninn hvolft eru gögn bara tölur í augum tölva. Hvort sem um ræðir ritgerð í íslensku eða uppáhalds lagið þitt, þá geyma tölvur öll gögn á sama hátt: sem talnarunur.

Tugakerfið

Tugakerfið (decimal system) er það talnakerfi sem við notum dags daglega og það kann að vera að það sé eina talnakerfið sem þú kannast við.

Tökum töluna 523 sem dæmi.

  • Af hverju þurfum við þrjá tölustafi til að tákna þessa tölu?
  • Af hverju skiptir röð tölustafanna máli? Þ.e., af hverju er 523 ekki sama talan og 253?

Við þekkjum það úr grunnskóla að staðsetning eða sæti (position) talnanna hefur mismikið vægi. Þannig er 3 í einingasætinu, 2 er í tugasætinu og 5 í hundraðssætinu. Þannig 523 er í raun leið til að tákna töluna

\[ 5 \cdot 100 + 2 \cdot 10 + 3 \cdot 1. \]

Í tugakerfinu notumst við við grunntöluna (base/radix) 10 sem hefur í för með sér að við notumst við 10 ólíka tölustafi. Það þýðir einnig að þegar við færum tölu eitt sæti til vinstri, þá er það jafngilt því að margfalda hana með 10.

Við getum þannig endurskrifað framsetninguna okkar að ofan á þann hátt

\[ 5 \cdot 10^2 + 2 \cdot 10^1 + 3 \cdot 10^0. \]

(munum að \(10^0 = 1\)). Sæti talnanna tákna þannig margfeldi við veldi grunntölunnar.

Í stað þess að tala um einingasæti, tugasæti, o.s.frv., þá er almennara að vísa í sætin eftir númeri þeirra. Í dæminu okkar væri 3 þá í sæti 0, 2 í sæti 1 og 5 í sæti 2. Við höfum þá þá almennu reglu að tala \(k\) í sæti \(n\) tákni \(k \cdot 10^n\). Dæmið að ofan sýnir okkur til dæmis að 5 í sæti 2 tákni \(5 \cdot 10^2\).

Aðrar grunntölur

Þá er vert að spyrja sig, er eitthvað merkilegt við grunntöluna 10? Gætum við notað aðra grunntölu?

Svarið við því er einfaldlega, nei, það er ekkert merkilegt við grunntöluna 10 annað en hún er sú sem hefur náð fótfestu í samfélaginu síðustu 800 ár eða svo. Babýlóníumenn notuðust til dæmis við grunntöluna 60 í sínu talnakerfi og Mayar við grunntöluna 20.

Við getum í raun búið til talnakerfi með hvaða grunntölu sem er!

Tvíundakerfið

Eins og nafnið gefur til kynna, þá er það talnakerfið sem notast við grunntöluna 2. Tölur í tvíundakerfinu (binary number system) notast því aðeins við tvo tölustafi, þ.e. 0 og 1. Til dæmis táknar talan 10110 í tvíundakerfinu

\[ 1 \cdot 2^4 + 0 \cdot 2^3 + 1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0 \]

sem er jafngilt \(16 + 4 + 2 = 22\) í tugakerfinu.

Tvíundakerfið er það talnakerfi sem tölvur notast við í grunninn. Ástæða þess er að tölvur eru í grunninn byggðar úr milljörðum örsmárra rafeindarofa sem kallast smárar (transistors). Þessir rofar geta aðeins verið í tveimur stöðum, þ.e. kveikt (on) og slökkt (off). Þessar stöður smáranna ríma vel við tvíundakerfið, þar sem við getum táknað kveikt með 1 og slökkt með 0. Þannig getum við notað smára til að framkvæma útreikninga á tvíundatölum.

Í stærðfræði er lágvísir (e. subscript) notaður til að aðgreina tvíundatölur (og tölur í öðrum talnakerfum) frá tugakerfistölum. Þannig getum við sett fram \(10110_2 = 22\). Hefðin í tölvuheiminum er að tákna tvíundatölur með forskeytinu 0b, þannig væri \(10110_2\) táknuð sem 0b10110.

Sextándakerfið

Sextándakerfið (e. hexadecimal number system, hex) er talnakerfið sem notast við grunntöluna 16. Þegar grunntalan er orðin stærri en 10, aftur á móti, þurfum við að takast á við nýtt vandamál. Við eigum nefnilega bara 10 hefðbundna tölustafi! Í sextándakerfinu hefur myndast sú hefð að nota bókstafina \(A\), \(B\), \(C\), \(D\), \(E\) og \(F\) sem tákn fyrir gildin 10, 11, 12, 13, 14 og 15, auk hinna hefðbundnu tölustafa 0 til 9. Þannig táknar talan \(D1C3\) í sextándakerfinu

\[ 13 \cdot 16^3 + 1 \cdot 16^2 + 12 \cdot 16^1 + 3 \cdot 16^0 \]

sem er jafngilt 53699 í tugakerfinu.

Tölur í sextándakerfinu má tákna með lágvísi á svipaðan máta og tölur í tvíundakerfinu, þ.e. \(D1C3_{16}\), en stundum er notast við lágvísinn hex sem vísar í enska nafnið hexadecimal, þ.e., \(D1C3_{hex}\). Í tölvuheiminum er yfirleitt notast við lágstafi í stað hástafa og forskeytið 0x notað til að tákna sextándakerfistölur. Þannig væri talan \(D1C3_{16}\) táknuð sem 0xd1c3.

Til hvers að nota sextándakerfið?

Þar sem tölvur skilja aðeins tvíundakerfið og við mennirnir erum vanastir tugakerfinu, má spyrja sig til hvers við séum yfirhöfuð að flækja málin með sextándakerfinu?

Svarið felst í því hversu plássfrekt tvíundakerfið er. Það krefst margra stafa til að tákna stórar tölur, sem gerir þær langar og illlæsilegar fyrir mannsaugað. Vegna þess að 16 er veldi af 2, þá passar nákvæmlega eitt sextándakerfistákn fyrir hverja 4 bita. Sextándakerfið er því í raun og veru notað sem eins konar stytting eða „hraðritun“ fyrir tvíundagögn, sem auðveldar að lesa og greina gögn á skjá.

Vissir þú?

Vegna þess að sextándakerfið inniheldur bókstafina A til F, fóru forritarar snemma að leika sér að því að mynda orð með þeim, stundum kallað Hexspeak. Þetta var oft gert til að merkja sérstök svæði í minni tölvunnar eða sem auðkenni á skrám (svokallaðar töfratölur eða magic numbers).

Frægasta dæmið er líklega 0xDEADBEEF sem var notað í kerfum frá IBM og Apple til að merkja minni sem var ekki lengur í notkun. Annað þekkt dæmi er 0xCAFEBABE sem allar Java-forritsskrár byrja á enn þann dag í dag!

Færslur á milli talnakerfa

Í þessum kafla ætlum við ekki að fjalla almennt um færslur á milli talnakerfa. Hægt er að nálgast tól til að framkvæma það.

Þó er eitt sem vert er að nefna þegar kemur að tengingu milli tvíundakerfisins og sextándakerfisins. Skoðum eftirfarandi töflu sem sýnir gildi allra tölustafa sextándakerfisins í tvíundakerfinu.

Tugakerfi Tvíundakerfi Sextándakerfi
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 a
11 1011 b
12 1100 c
13 1101 d
14 1110 e
15 1111 f

Vegna þess að 16 er fjórða veldi af 2, þ.e., \(2^4 = 16\), þá er nóg fyrir okkur að skoða tvíundagildin fyrir hvern tölustaf í sextándakerfistölu og breyta þeim koll af kolli í tvíundakerfið til að breyta allri tölunni frá sextándakerfinu yfir í tvíundakerfið.

Í dæminu hér fyrir neðan sjáum við að öllum tölustöfunum í \(D1C3_{16}\) hefur verið breytt í samsvarandi tvíundatölu, sem finna má í töflunni.

\[ \underbrace{D}_{1101}\underbrace{1}_{0001}\underbrace{C}_{1100}\underbrace{3}_{0011} \]

Við getum svo skeytt tvíundatölunum saman og fáum við þá að

\[ D1C3_{16} = 1101000111000011_2 \]

Á nákvæmlega sama hátt getum við breytt tvíundatölu í sextándakerfistölu. Við byrjum þá á því að skipta tvíundatölunni upp í fjögurra tölustafa hópa (byrjum hægra megin). Ef við endum með færri en 4 tölustafi í lokin, þá getum við bætt við auka 0 framan á töluna (munum að núll fremst í tölustöfum hafa engin áhrif á gildi tölunnar, t.d. \(010 = 10\)).

Fróðleikur: Hálfbæti

Í tölvunarfræði samanstendur eitt bæti af 8 bitum. Þegar við skiptum bæti í tvennt, þ.e. í tvo 4 bita hópa (eins og gert er til að finna sextándakerfistákn), kallast slíkur hópur á ensku Nibble – sem er skemmtilegt orðaleikur þar sem "byte" hljómar eins og "bite" (biti) og "nibble" þýðir smábiti eða nart. Á íslensku er þetta kallað hálfbæti.

Viljum við t.d., breyta \(110101011_2\) í sextándakerfistölu, getum við skipt henni upp á eftirfarandi hátt.

\[ \underbrace{0001}_{1} \underbrace{1010}_{A} \underbrace{1011}_{B} \]

Við sjáum þá að \(110101011_2 = 1AB_{16}\).