@t[A bittől a gigáig]~~META:date created = 2006-12-18~~ Úgy terveztem, hogy cikket írok a számítógép bizonyos tulajdonságairól, de beláttam, hogy előbb célszerű lenne tisztázni egypár alapismeretet. Kezdjük az elején: a számokkal. A számítógépet azért hívják számítógépnek, mert számít. Élete számítások végzésével telik. Az a számítógép, ami ma már zenéket és videókat játszik le, könyvek szövegét dolgozza fel, információkat tölt le nekünk a webről, levelez és még sok minden mást csinál, belül valójában csupán egyetlen dologra képes: számolni. És csak egyfajta adatot ismer: számokat. Minden elképzelhető adatot számokból rak össze. (Valahogy úgy van ez, mint az anyagok szerkezete. A mindennapi ember különböző anyagokként érzékeli a követ, a fát, a fémet, a textíliát, ezeknek rengetegféle változatait, a saját bőrét, haját, az élelmiszereket, a különféle műanyagokat és így tovább. Ezerszámra. A vegyész azonban felvilágosítja, hogy mindezek csupán a periódusos rendszer első kilencvenkét elemének különböző kombinációi.) Hogyan tárolja a számítógép a számokat? ==== A tízes számrendszer ==== A számítógépet villanyáram hajtja, ezért kettes számrendszerben dolgozik. Két állapotot különböztet meg: ha egy vezetékben van áram, vagy ha nincs. (Ez durva leegyszerűsítés, de céljainknak megteszi.) Mielőtt megismerkedünk a kettes számrendszerrel, érdemes föleleveníteni a mindennapi életben használt tízes számrendszer működését. Tízes számrendszerben a megszámolandó dolgokat tízesével csoportosítjuk. Például a 8319-es szám azt jelenti: nyolc darab ezres, három darab százas, egy darab tízes és kilenc darab egyes. | {{978-1000.gif}} | {{978-100.gif}} | {{978-10.gif}} | {{978-1ft.gif}} | | 8 | 3 | 1 | 9 | Azért tehettem ide pénzek képeit, mert a pénzrendszerünk is így működik, tízes alapon. Egy különbség viszont van. Pénzben tíz forintot ki lehet fizetni egy tízessel vagy tíz egyessel (no meg ötösökkel, kettesekkel is). A 10-es számot //leírni// viszont csak egy darab tízessel lehet. Nem ezt írjuk: | {{978-1000.gif}} | {{978-100.gif}} | {{978-10.gif}} | {{978-1ft.gif}} | | 8 | 3 | 1 | 10 | hanem ezt: | {{978-1000.gif}} | {{978-100.gif}} | {{978-10.gif}} | {{978-1ft.gif}} | | 8 | 3 | 2 | 0 | A szabály: minden címletből csakis 0, 1, 2, 3, 4, 5, 6, 7, 8 vagy 9 darab lehet; ha bármiből tíz lenne, akkor a következő címletből veszünk még egyet. Ezeket a számjegyeket használja a tízes számrendszer. ==== A kettes számrendszer ==== El lehet képzelni olyan pénzeket, amik kettes alapon működnek: egyforintos, kétforintos, négyforintos, nyolcforintos… Itt egy címletből csak 0 vagy 1 darabot használhatunk; ha bármiből kettő lenne, akkor a következő címletből veszünk eggyel többet. Nézzünk egy példát. | {{978-128.gif}} | {{978-64.gif}} | {{978-32.gif}} | {{978-16.gif}} | {{978-8.gif}} | {{978-4.gif}} | {{978-2.gif}} | {{978-1.gif}} | | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | Így néz ki egy szám kettes számrendszerben. Egy darab 128-as meg egy darab 64-es meg egy 4-es meg egy 2-es meg egy 1-es összesen 197. Kettes számrendszerben tehát 197-et így írjuk: 11001011. Mivel itt egy számjegy sokkal kevesebb (tíz helyett két, vagyis ötödannyi) érték megkülönböztetésére alkalmas, ugyanazt a számot kettes számrendszerben sokkal több számjegyen tudjuk leírni: – egy számjegy: 0-tól 1-ig; – két jegy: 00-tól 11-ig (0-tól 3-ig); – három jegy: 000-tól 111-ig (0-tól 7-ig); – négy jegy: 0000-tól 1111-ig (0-tól 15-ig); – öt jegy: 0-tól 31-ig; – hat jegy: 0-tól 63-ig; – hét jegy: 0-tól 127-ig; – nyolc jegy: 0-tól 255-ig. A számítástechnikusok a kettes számrendszert latin szóval //bináris//nak hívják, a kettes számrendszerbeli számjegyet pedig //bit//nek. Ez rövidítés: angolul bináris számjegy //binary digit,// ennek az elejéből és végéből állt össze a bit szó, ami egyébként értelmes angol szó, darabkát, falatot jelent. ==== Átszámítás tízesből kettesbe ==== Hogyan alakítunk át //(konvertálunk)// egy számot tízes //(decimális)// számrendszerből kettesbe? A dolog nem nehéz, csak a bináris pénzdarabok címleteit kell tudni. Ezek kettő hatványai: 20 = 1 21 = 2 22 = 4 23 = 8 24 = 16 25 = 32 26 = 64 27 = 128 28 = 256 29 = 512 210 = 1024 211 = 2048 212 = 4096 213 = 8192 214 = 16 384 215 = 32 768 216 = 65 636 Ezt a sorozatot a számítástechnikus szakik régóta fejből tudják. Vegyünk egy számot, mondjuk 1956-ot. Mennyi lesz ez kettes számrendszerben? Keressük meg a hatványok listájában a legnagyobb olyan számot, ami ennél a számnál még kisebb. Ez az 1024 lesz, mert a következő már nagyobb nála. A számunkhoz tehát kelleni fog egy {{978-1024.gif}} forintos. 1024 forintot már kifizettünk, marad 1956–1024=932. Megint keressük meg a legnagyobb számot, ami még kisebb ennél: ez az 512 lesz, tehát egy {{978-512.gif}} forintos is kelleni fog. Marad 932–512=420 forint. A legnagyobb címlet, ami ennél kisebb, a 256 forint, tehát kell egy {{978-256.gif}} forintos is. Marad 420–256=164 forint. Ezt egy {{978-128.gif}} forintossal tudjuk legjobban megközelíteni. Marad 36 forint, amihez kell egy {{978-32.gif}} forintos. Marad 4 forint, amit egy {{978-4.gif}} forintossal kifizetünk, és kész. 1956 tehát egyenlő {{978-1024.gif}}+{{978-512.gif}}+{{978-256.gif}}+{{978-128.gif}}+{{978-32.gif}}+{{978-4.gif}}, de ez így még nem szám. Írjuk föl az összes címletet csökkenő sorrendben, és amiből használtunk, ahhoz írjunk 1-et, amiből nem, ahhoz 0-t. | {{978-1024.gif}} | {{978-512.gif}} | {{978-256.gif}} | {{978-128.gif}} | {{978-64.gif}} | {{978-32.gif}} | {{978-16.gif}} | {{978-8.gif}} | {{978-4.gif}} | {{978-2.gif}} | {{978-1.gif}} | | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1956 kettes számrendszerben tehát 11110100100. ==== Átszámítás kettesből tízesbe ==== Konvertáljuk most vissza az 11110100100 számot tízes számrendszerbe, ezzel egyúttal ellenőrizhetjük is az előző számítást. A dolog nagyon egyszerű: ha egy számjegy 1-es, azt a címletet hozzáadjuk, ha 0-s, azt nem. Ezt már láttuk följebb, a 197-es szám példáján. De honnan tudjuk, hogy a szám első számjegye milyen címletet képvisel? Ez ugyanaz a probléma, mint amikor tízes számrendszerben ilyen számot látunk: 400 000 000. Itt a gyakorlat (meg a hármas csoportosítás) segít a //helyiérték// beazonosításában. Helyiértéknek hívjuk a számjegyeknek azt a tulajdonságát, hogy a szám egy adott helyén (a jobbról számított első, második stb. jegyen) milyen értéket képviselnek. Aki gyakran lát kilencjegyű számokat, már fejből tudja, hogy ezt a számot négyszázmilliónak kell olvasni. Bináris rendszerben ez nehezebb, mert nem szoktunk úgy hozzá. Két módszer van, amivel beazonosíthatjuk a helyiértékeket. 1. Jobbról balra végiglépkedünk a számon, számoljuk a számjegyeket és mondogatjuk a címleteket: 1-es, 2-es, 4-es, 8-as, 16-os, 32-es… Ez egyszerűbb, mert nem kell fejből tudni a hatványtáblázatot, csak kettővel szorozgatni. Persze ha már végigmegyünk a számon, akkor egyúttal össze is adogathatjuk az 1 értékű jegyeket. „1-es nincs, 2-es nincs, 4-es van (leírjuk: 4), 8-as nincs, 16-os nincs, 32-es van (hozzáírjuk: +32), 64-es nincs…” Így kapunk egy listát: 4+32+128+256+512+1024. Összeadjuk és kijön 1956. 2. Megszámoljuk a számjegyeket: 11110100100 tizenegy jegyből áll. Mivel a jobb szélső jegy 20-t jelent, a bal szélső 210-nek, vagyis 1024-nek felel meg. ==== Bit és byte ==== A biteket azonban a számítógépek nem tudják egymagukban kezelni: a memória nyolc bitből álló egységekre van felosztva, amik neve //byte// [bájt]. Nyolc biten, mint láttuk, 0-tól 255-ig terjedő számokat tárolhatunk, ezért a számítástechnikában különleges jelentősége van a 255-ös és a 256-os számnak; utóbbi az egy byte-on létrehozható kombinációk száma. Ha valamit tárolni akarunk a számítógépen, részekre kell osztanunk. Ha byte-nyi méretű részekre osztjuk, akkor egy-egy rész 256-féle lehet. Ha két byte-nyiakra, akkor 65 536-féle. Előfordul persze, hogy egy byte túlságosan sok arra, hogy a lehetséges kombinációkat tároljuk. Ilyenkor a byte-ot részekre osztjuk. Például régen léteztek olyan képernyőmódok, amikor a képernyő egy-egy pontjának például 16-féle színe lehetett. Így minden byte-on két pont színét tárolták: az első négy biten egy 0 és 15 közötti számot, a második négy biten még egy ugyanilyen számot, és a képernyő tartalmának tárolásához feleannyi byte kellett, mint ahány képpont volt. Még régebben kétszínű képekkel dolgoztunk, csak fekete vagy fehér lehetett minden képpont, így minden byte nyolc pont színét tárolta. Az ilyen módszerek nagyon fontosak voltak, amikor a számítógépeknek még kicsi volt a memóriájuk. ==== Kilobyte, megabyte… ==== A byte önmagában nagyon kevés, ahhoz, hogy csinálhassunk valamit, sok byte kell. A byte többszöröseiről gyakrabban hallunk, mint magukról a byte-okról. Az SI mértékegységrendszerben a //kilo// előtag jelöli valaminek az ezerszeresét (kilogramm, kilométer). Mint láttuk, a számítástechnikában kettő hatványai nagyon fontosak, ezért a //kilobyte// nem 1000, hanem 1024 byte-ot jelent; azért választották ezt a számot, mert ez van legközelebb az ezerhez. A byte többszöröseinek teljes listája: ^ név ^ jel ^ byte-ok száma ^ kimondva ^ | kilo | K | 1 024 = 210| ezer… | | mega | M | 1 048 576 = 220| egymillió… | | giga | G | 1 073 741 824 = 230| egymilliárd… | | tera | T | 1 099 511 627 776 = 240| egybillió… | | peta | P | 1 125 899 906 842 624 = 250| egybilliárd… | | exa | E | 1 152 921 504 606 846 976 = 260| egytrillió… | | zetta | Z | 1 180 591 620 717 411 303 424 = 270| egytrilliárd… | | jotta | Y | 1 208 925 819 614 629 174 706 176 = 280| egykvadrillió… | Nézzük meg, mekkora mennyiségek ezek voltaképpen. Egy byte-on gyakorlatilag egy betűt tudunk tárolni. A 256-féle érték soknak tűnik ilyen célra (amíg a számítógépeket csak angolul beszélő amerikaiak használták, bőven elég is volt ennyi), de két betű számára egy byte már nem elég. A byte-ot két négybites részre kellene osztani, amik egy-egy betűt képviselnek, de négy biten csak 16-féle számot tárolhatunk, ami nagyon kevés. Egy kilobyte ebből következően 1024 betűt jelent. József Attila //Eszmélet// című verséből ekkora darab fér el egy kilobyte-ban: ESZMÉLET 1 Földtől eloldja az eget a hajnal s tiszta, lágy szavára a bogarak, a gyerekek kipörögnek a napvilágra; a levegőben semmi pára, a csilló könnyűség lebeg! Az éjjel rászálltak a fákra, mint kis lepkék, a levelek. 2 Kék, piros, sárga, összekent képeket láttam álmaimban és úgy éreztem, ez a rend – egy szálló porszem el nem hibbant. Most homályként száll tagjaimban álmom s a vas világ a rend. Nappal hold kél bennem s ha kinn van az éj – egy nap süt idebent. 3 Sovány vagyok, csak kenyeret eszem néha, e léha, locska lelkek közt ingyen keresek bizonyosabbat, mint a kocka. Nem dörgölődzik sült lapocka számhoz s szívemhez kisgyerek – ügyeskedhet, nem fog a macska egyszerre kint s bent egeret. 4 Akár egy halom hasított fa, hever egymáson a világ, szorítja, nyomja, összefogja egyik dolog a másikát s így mindenik determinált. Csak ami nincs, annak van bokra, csak ami lesz, az a virág, ami van, széthull darabokra. 5 A teherpályaudvaron úgy lapulta Nincs tovább, a kilobyte betelt. De nemcsak a betűk foglalnak le egy-egy byte-ot, hanem az írásjelek és a szóközök is, a sorok végén álló Enter jel pedig hagyománytiszteletből két byte-ot foglal. Egy megabyte-ban már elfér József Attila összes költeménye, majdnem háromszor. Közel egy megabyte-ot tesz ki //A kőszívű ember fiai.// Egy megabyte bőven elég arra, hogy a képernyőn eredeti méretében elférő képet tárolhassunk, hacsak nem dolgozunk nagyon nagy felbontással. Egy átlagos zeneszám azonban nem fér el benne, két-három megabyte mindenképpen kell, de a 6-8 megabyte-nyi terjedelmű MP3 sem ritka. Egy CD-lemez kapacitása 700 megabyte, ami egy-kétezer átlagos terjedelmű könyvet tárolhat. A gigabyte manapság a legnagyobb használatban levő mértékegység. Az egyrétegű DVD-lemezek kapacitása 4,7 gigabyte, ezen a legnagyobb sűrítéssel hat óra képes-hangos videóanyag tárolható. MP3-akból persze sokkal több, egy rögtönzött próbával tizenkilenc zenei CD tartalmát sikerült elhelyeznem egyetlen gigabyte-ban. A terabyte ma még csak a nagy számítóközpontokban használható egység. Egy hatalmas könyvtár minden írott anyaga elférne egy terabyte-ban. ==== Hexadecimálisan ==== A számítástechnikusok kényelmes emberek, akik hamar elunták, hogy egyesek és nullák hosszú, áttekinthetetlen sorozataival kelljen számolniuk. Egy ideig nyolcas //(oktális)// számrendszerben számoltak: három bitet összefogtak egy számjeggyé, ami 0-tól 7-ig terjedhetett. Így a 255-ös szám 377-re jött ki: | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | 3 || 7 ||| 7 ||| De ez kényelmetlen volt, egy idő után ezért áttértek a tizenhatos //(hexadecimális)// számrendszerre. Itt byte-ot kétszer négy bitre (két //nibble//-re) osztják, és mindkettőt egyetlen számjegy helyettesíti. Mivel így tizenhatféle számjegy lehetséges, új számjegyeket kellett bevezetni: ^ tizenhatos ^ kettes ^ tízes ^ | 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 | | A | 1010 | 10 | | B | 1011 | 11 | | C | 1100 | 12 | | D | 1101 | 13 | | E | 1110 | 14 | | F | 1111 | 15 | Így például az 11001011-et így tesszük át tizenhatosba: az első fele 1100, vagyis C, a második fele 1011, vagyis B. Tehát CB. ==== Átszámítás tízesből tizenhatosba ==== Decimális számokat hexadecimálisba ugyanúgy konvertálunk, mint binárisba. Most persze tizenhat hatványait kell használnunk: 160 = 1 161 = 16 162 = 256 163 = 4096 164 = 65 636 Vegyünk például kereken 50 000-et példaként. A legnagyobb hatvány, ami még kisebb nála, 4096. Most viszont ki kell számolnunk, hogy hány darab {{978-4096.gif}} forintosra lesz szükség. 50 000:4096=12, vagyis C darab. Az első számjegy C. 12·4096=49 152. Ennyit fizettünk ki eddig. Maradt 848. Vegyük a {{978-256.gif}} forintosokat. 848:256=3, ez a második számjegy. 3·256=768, ennyit fizettünk ki, maradt 80. 80:16=5, ennyi {{978-16.gif}} forintosra lesz szükség, maradék nincsen, tehát {{978-1.gif}} forintos egyáltalán nem lesz. 50 000 hexadecimálisan C350. ==== Átszámítás tizenhatosból tízesbe ==== Mennyi C350 decimálisan? Mivel a szám négyjegyű, a bal szélső jegy a {{978-4096.gif}} forintos. Tehát C·4096, azaz 12·4096=49 152, 3·256=768, 5·16=80, ezek összege 50 000. ==== Jelölések ==== A számítástechnikai szakirodalom általában ezt a négy számrendszert használja: tízest, kettest, tizenhatost és régebben nyolcast. A különböző számrendszerek megkülönböztetésére jeleket használnak: – kettes: %10110110 (de ezt ritkán használják, mert a kettes számrendszerbeli számok jól felismerhetők); – tizenhatos: C1h, $C1, &hC1, 0xC1; – nyolcas: &377, 0377. A decimális számokat nem jelöljük külön. @blogf[!]