Bit, byte és a számrendszerek

Az előző cikkből megtudtuk, hogy a számítógépek CPU-ja számokkal dolgozik, így ennek kapcsán szükséges néhány fogalom tisztázása és pár számrendszer alapszintű ismerete.

Az információ alapegysége a BIT (BInary digiT), amely egy logikai állapotot rögzít két lehetséges érték közül. A két lehetséges érték általában a "0" és az "1", de ha elvonatkoztatunk az informatikától, akkor ez a két érték lehet más is, pl.: férfi/nő, igaz/hamis, kikapcsolva/bekapcsolva, stb.

Ha ezekből a bitekből adott számút egymás mellé rakunk, akkor megkapjuk a byte-ot. A byte mérete hardverenként változik (történelmileg így alakult, fogadjuk el) és az adott rendszerben a legkisebb megcímezhető memória méretét is meghatározza. Manapság általánosan elfogadott, hogy 8 bitet tekintünk egy byte-nak (és a továbbiakban amikor byteról beszélek akkor én is erre a méretre gondolok), de például az Internet Protocol-ban ezt külön névvel illették: octet.
Tehát hiába tudunk a BIT-en kétféle állapotot is rögzíteni, amely néhány esetben elegendő is lehetne 1-1 feladat modellezéséhez, a memóriában a legkisebb tárolható érték az 8 bit, és jelenleg a programozók zöme nem veszi a fáradtságot, hogy BIT műveletekkel memóriát spóroljon.

A témához kapcsolódóan vannak még egyéb csoda szavak is a byteon kívül? Persze, hiszen az ilyen szavak esztelen halmozásától meglehetősen tudományosnak tűnhet a laikusok számára amikor két programozó beszélget. Ilyenek pl. a word (nem, nem a szövegszerkesztő), a double word/long word, quad word, stb, melyek jellemzően a byte sokszorozásából (duplázásából, négyszerezéséből, stb.) kialakult szavak, de el tudunk indulni a másik irányba is és akkor jöhet a képbe a nibble (ami manapság 4 bit tehát a byte felezése). Ezeket a szavakat óvatosan használd, mert egyes rendszerek esetében más más tartalommal bírhatnak. Jobban járunk ha megnevezzük a tároláshoz használt bitek számát.

Számrendszerek

A mindennapi életben a leggyakrabban a 10-es (decimális) számrendszert használjuk, ahol is 0-tól 9-ig összesen 10 variációban tudjuk leírni a számokat.
Általánosságban elmondható, hogy minden számrendszerben annyi féle "szám" van, ahányas számredszerről beszélünk. A számrendszer alap száma (base number vagy radix néven találkozhatsz vele a szakirodalomban) tehát ezt határozza meg

Mi történik 9 után? Semmi extra, lépünk egy helyiértéket (tizesek) és kezdjük előröl, így jöhet a 10, 11, 12, stb. Majd 99-nél újra helyiértéket lépünk (százasok) és kezdjük előröl: 100, 101, 102. Mivel ezt az iskolában belénk verik nem is okoz gondot a használata.

Ha jól megnézzük az információ alapegységével, a BIT-el kétféle értékkel dolgozhatunk: 0 és 1. Ez pedig nem más, mint a 2-es (bináris) számrendszer. A kettes számrendszerben pont ez a kétféle szám létezik, a 0 és az 1. Számolni tökéletesen ugyanúgy kell vele, mint a 10-es számrendszerrel, csak kicsit hamarabb kell helyiértéket lépnünk. Míg a 10-es számrendszernél a helyiértékek a 10 hatványaival egyeznek meg: 10⁰ = 1, 10¹ = 10, 10² = 100, 10³ = 1000, stb (egyesek, tízesek, százasok, ezresek, stb), addig kettes számrendszernél a 2 hatványaival: 2⁰ = 1, 2¹ = 2, 2² = 4, 2³ = 8, stb.

Ha megnézzük, hogy 1 byte (8 bit) így mekkora értéket tud tárolni, akkor azt kapjuk, hogy a legkisebb 00000000 és a legnagyobb 11111111 kettes számrendszerbeli számok átváltva 0-255 közé esnek (a manuális átváltást nem mutatom be, minden számológép tud már 2-es vagy a később bemutatott 16-os számrendszerbe átváltani), azaz összesen 256 féle számunk lehetséges 1 byteon.

Fontos megjegyezni, hogy a biteknek a byteon belüli elhelyezkedését be szokás számozni, az első bit a 0-ás, míg a nyolcadik bit a 7-es. Ezen kívül az első (LSB) és utolsó bit (MSB) külön nevet is kapott, mert ők bizony kiváltságosak, hiszen nyitják illetve zárják a byteot. (a témához kapcsolódik még az úgynevezett endianness fogalma, de nem szeretnélek hirtelen belefolytani a mélyvízbe így inkább majd ott foglalkozok velük ahol valóban szükség lesz rá).

Azt a visszajelzést kaptam, hogy elsiklottam azon (számomra triviális) tény felett, hogy amikor leírunk egy számot akkor azt balról jobbra tesszük, tehát az első számjegy bal oldalon van míg az utolsó a jobb oldalon. A bitek számozása viszont pont ellentétesen történik, a 0-ás bit a jobb oldalon helyezkedik el, és ezt nem árt pontosítani; köszönet érte.

  • LSB: Least Significant Bit (legkevésbé jelentős bit, vagy kicsit magyarosabban legjelentéktelenebb bit, hiszen ennek valtozása alig befolyásolja az ábrázolandó számot)
  • MSB: Most Significant Bit (nem nehéz kitalálni, hogy ez pont az ellenkezője az LSB-nek)

Az MSB-nek azon kívül, hogy ő tanyázik a legmagasabb helyiértéken egyéb szerepet is szántak, ha szeretnénk negatív számokkal is dolgozni (kettes komplemens), akkor ez a bit mondja meg a CPU-nak (egész pontosan az azon belül található ALU-nak), hogy pozitív (0) vagy negatív (1) számról beszélünk (sign azaz előjel bitnek is hívjuk). Nyílván ebben az esetben az említett 256 különböző szám továbbra is fennáll, azonban két részre osztódik: a pozitív (0-127: 00000000, 01111111) és negatív (-128 és -1 között: 10000000, 11111111) számokra.

Vajon használunk más számrendszereket is? Igen, méghozzá anélkül, hogy ez feltűnne. Ismerős a fok-perc-másodperc? Vagy a kistestvére az óra-perc-másodperc? Hatvan másodperc az 1 perc, 60 perc az egy óra (vagy fok ha elsőt nézzük). Ez bizony a hatvanas számrendszer, ahol 60 után váltunk helyiértéket, csak éppen ugyanugy a 10-es számrendszerben megszokott (arab) számokat használjuk.

OFFTOPIC: Számok írásához manapság az arab számokat használjuk, de vannak ettől eltérő ábrázolási módok is, és kiváló példa erre a római számok: I, V, X, L, C, D, M melyek arab számos megfelelői: 1, 5, 10, 50, 100, 500, 1000. A római számokat manapság elég ritkán használjuk (vagy egyáltalán nem is).

Szükségünk van még a 16-os (hexadecimális) számrendszerre, amelynek reprezentálásához viszont nem elegendő az arab számok nyújtotta 10 variáció, hiszen ennek használatához 16 féle különböző szimbólumra lenne szükségünk, ám a megszokott arab számok elfogynak 9-nél. Ennek a problémának az áthidalására kölcsönveszünk betűket az angol ABC-ből, így 9 után az A, B, C, D, E, F betűk jönnek (így meg is van a 16 szimbólumunk: 0-tól 9-ig összesen 10 majd 6 betű az ABC-ből). Tehát a számolás a következőképpen néz ki a 16-os számrendszerben: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F és akkor itt helyiértéket lépünk: 10, 11... ...19, 1A, 1B, stb.

Szuper, már csak egy a gond: ha azt írom, hogy 10 akkor honnan fogom tudni, hogy ez valójában 2 (a 10 bináris számrendszerből decimálisba váltva 2), valóban 10 (decimálisan) vagy 16 (hexadecimálisan). Hát így, hogy nincs megadva, hogy mely számrendszert használtuk így sehonnan. Programozási nyelvtől függően az egyes számrendszerben ábrázolt számokat különböző módon jelölik. Ezeket a választott nyelvnél meg kell tanulni; néhány lehetséges ábrázolásmód a teljesség igénye nélkül: 0x10 (hexa), #10 (szintén hexa), 10h (szintén hexa), 0b10 (bináris), 0o10 (oktális, azaz 8-as számrendszer: nulla és "o" betű... vacak dolog megkülönböztetni két ennyire hasonló "szimbólumot". Talán már láttál programozótól leírva áthúzott nullát: hát pont ezért, hogy véletlenül se keverjük össze az "o" betűvel).

Álmos hívta fel rá a figyelmem, hogy célszerű lenne megemlíteni a 8-as számrendzsert, ami néha előkerül a számítástechnikában. Ezt most fentebb részben megtettem. A számrendszerekről eddig szerzett tudásunk alapján pedig megállapíthatjuk, hogy a 8-as számrendszerben 8 féle szám található (0-tól 7-ig) és a helyiértékei a 8 hatványaival egyeznek meg. Mindazonáltal, hogy mi a programozás során soha (soha nem mondd, hogy soha) nem fogjuk használni a 8-as számrendszert a számítástechnikában azért jelen van, egyik kiváló példa rá a *nix rendszerek CHMOD parancsa.

Most, hogy ismerjük a kettes számrendszert talán értelmet nyer az idevágó informatikus vicc is:

A világon 10 féle ember van: aki ismeri a 2-es számrendszert és aki nem.

Mit tanultál ebben a leckében?

  • a BIT az információ alapegysége és jellemzően vagy 0 vagy 1, de a két állapotnak mi is adhatunk bármilyen jelentést
  • a bitek csoportja a byte, amely manapság általánosan elfogadottan 8 bit
  • a mindennapi életben a 10-es számrendszert használjuk a leggyakrabban, ezen kívül használjuk a 60-as számrendszert is anélkül, hogy realizálnánk
  • a BIT a két állapotának köszönhetően tökéletesen idomul a 2-es számrendszerhez
  • a számrendszerek valójában pofon egyszerűek, de mivel leggyakrabban a 10-est használjuk a mindennapjainkban elsőre kissé furcsának tűnhetnek