menu
shopping_cart
0
KOSÁR

11. lecke

Adat, számrendszerek, kódolás

lightbulb_outlineMi az a bináris adat? A kettes számrendszer használata az informatikában

Az adat

Az adat valamilyen jelsorozat formájában megjelenő ismeret. Önmagában nem hordoz információt, csak, ha definiáljuk milyen adatról van szó. (pl: 30 → 30 bit) Ekkor az adat információvá válik. A számítástechnikában az adat számokkal leírható dolgokat jelent, melyek számítástechnikai eszközökkel rögzíthetők, feldolgozhatóak, és megjeleníthetők.

A bináris adat

A bináris adat alapegysége a bit, ami 1 vagy 0 értéket vehet fel.

n darab biten 2n mennyiségű adat tárolható

Például: 3 bittel hány darab kettes számrendszer-beli szám írható le?

A megoldás: 23 = 8 darab

A számok pedig: 000, 001, 010, 100, 011, 110, 101, 111

Az üzenetnek lehet információtartalma, amit a Hartley-formula ad meg.
H = m * loga n

Ahol:

  • m: az üzenet hossza
  • n: a választható szimbólumok száma
  • a: letárolási számrendszrer

Például: Egy szövegszerkesztőbe begépelt 5 darab ASCII kódolású karakter hány bit információt közöl velünk?

  • Az üzenet hossza m=5
  • Az ASCII kódtábla 256 választható szimbólumból áll, ezért n=256
  • Kettes számrendszerben tároljuk le a karaktereket, ezért a=2

Az üzenet információtartalma: H = 5 log 2 256 = 40 bit*

A merevlemezen is a szövegfájl 40 bitnyi, tehát 5 byte tárhelyet foglal el.

A bit és a byte

A bit fizikailag egy adott feszültségszintet jelent, ami a számítógép áramköreiben jelenik meg. A 0 és 1-es érték két feszültségszintnek felel meg az áramkörökben. Az 1-es feszültségszintet H (high) szintnek, a 0-ás szintet L (low) szintnek nevezik. A feszültségszint áramkörtípusonként eltérő, de általában

  • a 0-2 Volt feszültség között 0-ás, alacsony szintről
  • 3-5 Volt között 1-es, magas szintről van szó.

Az áramkörökben folyó feszültségeket vizsgálni az oszcilloszkóp nevű eszközzel lehet, ami egy olyan elektronikus mérőműszer, amely elektromos feszültségek időtartománybeli ábrázolására és mérésére szolgál. A képen látható egy ilyen eszköz, ami egy vezetékben folyó bitsorozatot jelenít meg a képernyőjén. A vízszintes tengely az idő, a függőleges tengely a feszülség. A képernyőn épp egy 0-1-0-1-0-1-0-1 bitsorozatot látunk ábrázolva, tehát a vezetékben egymás után alacsony és magas feszültségszint jelenik meg.

A képernyőn jelenleg „távolról” nézzük a jelet, ezért szép szabályosnak látszik. A 0-1 és az 1-0 váltás szinte függőleges egyenes – a valóságban azonban nem ilyen szép. Közelítsünk rá a váltásokra:

Ezen a két képen közelebbről nézhetjük meg a feszültségszint váltásokat: A bal oldali képen egy 0-1 váltást látunk, ez az ún. felfutó él. A jobb oldali képen 1-0 váltás van ábrázolva, ez a lefutó él. Látható, hogy nem azonnal történik a váltás, hanem egy kis időbe telik. A váltás hossza eltérő lehet – ezért a számítógép áramköreiben közlekedő bitek egyes áramköri elemekhez előbb érhetnek oda, egyes bitek pedig később. Ez nem jó. Szükség van valami szinkronizáól jelre, ami biztosítja, hogy a részegységek egyszerre működjenek. Ez a processzor által generált órajel.

A processzorokban található egy kvarckristály (piezoelektromos kristályoszcillátor) ami az órajel előállításához szükséges rezgés stabilitását biztosítja. Az órajel egy 0-1-0-1-0-1 váltásokból álló bitsorozat, ami a számítógép részegységeinek működését ütemzi. Az órajel sebességét Hertz-ben adjuk meg, ami megmondja, hogy 1 másodperc alatt hány ”rezgés”, hány 0-1 váltást generált a kvarckristály. Az órajel minden áramköri részegységhez hozzá van kötve és az egységek csak 1-es szintre végeznek műveletet. Például, ha a processzornak össze kell adnia két számot, akkor a két szám a processzor regisztereibe különböző időben is megérkezhet, az összeadás az órajelre történik meg.

A műveletvégzés történhet az órajel 1-es szintjének felfutó és lefutó élére is. (az ábrán a lefutó élre történik)

Adatmennyiségek

Láttuk, hogy a bit az alacsony vagy magas feszülségszint. A biteket összefoghatjuk nyolcasával, így lesz 1 byte-unk: 8 bit = 1 byte ( by eight – nyolcasával angol szóból jön)

A bináris adatot bárhogy értelmezhetjük. A memóriában nincs megadva az eltárolt adatok típusa. Egy adatról a rá alkalmazott utasítás dönti el a típusát, illetve mivel az eltároló program tudja, hogy az adott memóriaterületre ő milyen típusú adat kettes számrendszerbeli alakját írta, ezért az adat kiolvasásakor tudni fogja, hogy hogyan kell azt értelmezni.

Például véletlenszerűen kiválasztottunk egy 1 byte-os memóriaterületet, amiben ezt találtuk:

0011 1101

Mi ez?

  • Egy 16-os számrendszerbeli adat? → 3D
  • Egy 10-es számrendszerbeli adat? → 61
  • Vagy egy ASCII karakter bináris megfelelője? → =
  • Vagy valamelyik program itt tárolja, hogy egy pixel vörös csatornáján milyen érték látható?

Kit tudja...

A memóriában nincs tárolva az adatok típusa. A memóriában turkálni HexEditor programokkal lehet. (A HexEditor program hexadecimális (tizenhatos számrendszerben) írja ki a képernyőre a memória tartalmát, pusztán azért, mert így leírva rövidebb, mint a bináris adat, kevesebb helyet foglal el. Az alsó képen egy Hexeditor látható, amint éppen mejelenít egy memóriaterületet. Az első oszlop a memóriacím, a középső terület az ezeken a címeket található adat, a jobb oldali oszlop pedig ezen adatok ASCII karakter reprezentációi.

Látható, ahol össze-vissza karakterek vannak, ott valami más adat van a memóriában (ki tudja mi) – azonban az utolsó sorban olvasható értelmes adat is, azaz itt tényleg szöveg volt eltárolva.

Ilyen program például a Window-os HxD, ami innét letölthető: http://mh-nexus.de/en/hxd/ vigyázzunk, mert segítségével a memória és a merevlemez tartalmát szerkeszthetjük, és ha nem tudjuk melyik adatot módosítjuk, akkor annak beláthatatlan következményei lesznek. Gyakori felhasználási területe: A hekkerkedés, mert futás közben, önkényesen módosíthatjuk bármely program által a memóriában eltárolt adatot.

Kettes számrendszer

Az áramköri elemekben tehát két feszülségszint létezik 0 és 1, ezért a számítástechnika alapja a kettes számrendszer. A kettes ↔ tízes számrendszer átváltást oda-vissza ismerni kell!

10 → 2 Átváltás

10-es számrendszerből kettesbe történő átváltás a maradékos osztás elvén alapul. Próbáljuk átváltani a 61-et kettes számrendszerbe:

61
30  1
15  0
7   1
3   1
1   1
0   1

Az alkalmazott lépések:

  1. Elosztjuk kettővel a számot, az eredmény egész részét lejegyezzük (a bal oldali oszlop).
  2. A maradékot (0 vagy 1) is feljegyezzük (a jobb oldali oszlop).
  3. Ezt kell ismételgetni addig, amíg az egyik osztás eredménye 0 nem lesz

A lépések végén a jobb oldali oszlop alulról felfele történő olvasásával kapjuk meg a keresett számot: 111101

2 → 10 Visszaváltás

A visszaváltás a kettő hatványaival történő szorzáson alapul:

Alkalmazott lépések:

  1. Leírjuk a kettes számrendszer-beli számot
  2. Leírjuk alá kettő hatványait
  3. Csak azokat a hatványokat adtuk össze, ahol a bináris alak megfelelő helyiértékén 1 van.

Nézzük a kettes számrendszerbeli alaőműveleteket hogyan valósítják meg a számítástechnikában:

2-es számrendszer: Összeadás

Az összeadás ugyanúgy végezhető, mint a 10-es számrendszer-beli összeadás. Szabályok:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 maradék 1

Például:

2-es számrendszer: Kivonás

A kivonás a számítástechnikában az összeadásra vezethető vissza az A-B=A+(-B) összefüggés alapján. Ehhez előbb meg kell ismernünk a negatív számokat!

Előjeles szám (kettes komplemens)

A negatív számok ábrázolására olyan megoldásra van szükség, amelyben egyértelműen megállapítható a számról, hogy negatív vagy pozitív, és amely ábrázolás mellett a matematikai műveletek is könnyen elvégezhetők maradnak. Ez utóbbi feltétel azt jelenti, hogy olyan ábrázolási módot kell alkalmaznunk, amely esetén az összeadásnál nem kell további szabályokat megadni ha valamelyik vagy mindkét szám negatív. A kettes komplemens elnevezésű számábrázolási ábrázolási mód olyan amelyben az összeadás szabályait egy negatív számra és annak abszolút értékére alkalmazva az összeadás eredménye nulla lesz (ugyanannyi biten ábrázolva).

Az előjeles kettes számok képzését pár lépésben el lehet végezni:

  1. Felírjuk az abszolút értékét
  2. Negáljuk (minden bitjét az ellentettjére változtatjuk)
  3. Hozzáadunk 1-et

A képzett alakban az első bit az előjelbit lesz

  • a szám negatív, ha az előjelbit 1
  • a szám pozitív, ha az előjelbit 0

Például a -5 kettes komplemens alakja:

  • Felírjuk az abszolút értékét (5)

    0101
  • Invertáljuk a számot:

    1010
  • Hozzáadunk 1-et:

    1011

Tehát a -5 → 1011

Természetesen ránézésre ez is csak egy pozitív kettes számrendszerbeli szám, és a memóriában eltárolva senki nem mondja meg róla, hogy ez kettes komplemensben van és az első bitjét előjelbitként kellene értelmezni – de ami eltárolta tudja, hogy ez egy előjeles szám.

Lássuk, hogy ha összeadjuk a -5öt és az 5-öt, akkor tényleg 0-át kapunk:

0101 + 1011 = (1)0000

Az eredmény 10000 de a kikötés az volt, hogy ugyanannyi biten (4 bit) kell ábrázolni az eredményt, mint a tényezőket, az eredmény így tényleg 0000.

A kivonás a számítástechnikában tehát úgy történik, hogy Ha A-B műveletet el akarjuk végezni, akkor inkább az A+(-B) műveletet végzi el a processzor, ahol -B számot a fent olvasható kettes komplemens nevű lépéssorozat alapján generálja, ami biztosítja, hogy jó eredmény szülessen.

2-es számrendszer: Szorzás

A szorzás felfogható úgy, mint sok összeadás egymás után. A számítógép is így szoroz két számot.

2-es számrendszer: Osztás

Egy osztás művelet megismerése előtt meg kell néznünk, hogyan tárolja a számítógép a törtszámokat:

Törtszám (lebegőpontos számábrázolás)

A törtszámokat ábrázolni kettes számrendszerben a normál alak segítségével lehet. A normál alak egy szorzat, ami két részből áll: Egy 1 és 2 közötti számból, illetve ezt megszorozva 10 valamelyik hatványával:

Például a 0,00001234 szám normálalakja:

1,234 * 10-5

A normál alak m * 10k alakban van, ahol m neve mantissza, k a karakterisztika. Ezt a két részt tárolják el a lebegőpontos számábrázolásnál.

A mantisszát és a karakterisztikát tárolják el a lebegőpontos számábrázolásnál, a mantisszát 3 byte-on, a karakterisztikát, 1 byte-on.

Egy törtszámot tehát 3+1 = 4 byte-on tárolnak, és a 4 byte-on belül ilyen a törtszám felépítése:

Karakterisztika 1 byte

  • Ez egy előjeles szám (előjelbitje is van), mert ugye 10 hatványa lehet negatív is

Mantissza 3 byte

  • Itt csak a törtrészt tárolják el, tehát 1,234 esetén csak a 234 számot, az első 1-est nem. (Az első számjegy mindig 1-es a mantiszában, mivel a normál alak mantissza része 1 és kettő (1,999...) közötti szám.)

Az előjeles számok vázlatos képe tehát ilyen:

A lebegőpontos számokat azért hívják magyarul lebedőpontosnak, mert képzésükkor, amikor előállítjuk a normál alakot, akkor a tizedesvessző (angolszász nyelvterületen a pont) eltolódik, „lebeg” valamilen irányba. A lebegőpontos szám angol neve a float. C programozásban ez egy adattípus. Létezik kétszeres pontosságú lebegőpontos szám is a számítástechnikában, ekkor 2 byte a karakterisztika, és 6 byte a mantissza. Ez is egy adattípus C programozásban, ami kétszeres pontosságáról kapta a nevét: double.

Big endian, little endian

A memóriában és a számítógép egyéb tárolóin (például a processzor regisztereiben, merevlemezen...) bináris alakban vannak az adatok. Nem mindegy azonban az ”olvasási irány”. Ha a legnagyobb helyi értéket írjuk balra akkor big endian tárolásról, ha a legkisebb helyiértéket írjuk balra, akkor little endian tárolásról beszélünk. Például a 61-es szám:

Ez kompatibilitási problémákat vet fel, de szerencsére a mai modern processzorok (például az okostelefonokban ketyegő ARM processzor) switchable-endian funkcióval rendelkezik, rugalmasan kezeli a helyzetet.

BCD kódolás

Egy számot általában egy egységként kezelünk, a számjegyeit egyszerre értelmezzük. Lehetőségünk van azonban külön-külön is kettes számrendszerbe írni és eltárolni a számjegyeit. A binárisan kódolt decimális – Binary-Coded Decimal a decimális számok egy kódolási formája, amelyben minden számjegyet egy-egy bitsorozat ábrázol.

Például az 1234 számnak ”sima” kettes számrendszerben 10011010010 alakja van, BCD kódolásban pedig külön kell átváltani az 1,2,3 és a 4-es számjegyeket, egymástól függetlenül, azaz: 0001 0010 0011 0100 lesz az alakja.

BCD kódolást használnak pédául a hétszegmenses kijelzőkön történő megjelenítéshez, mert ezt a kijelző áramköreinek könnyebb feldolgoznia, hisz a számjegyek külön vannak kódolva, így könnyű megtalálni hozzájuk a megjelenítendő számalakot.

Hibajavító kódolások

Ha egy vezetékben adatokat küldünk, akkor a külvilág viszontagságai beleszólhatnak a bitsorozatba (külső mágneses tér, szakadás...). Erre kitaláltak pár egyszerű hibadetektáló vagy hibajavító kódolást:

Paritásbit - hibadetektálás

A paritásbit egy n hosszúságú bitsorozat n+1-edik bitje, aminek értéke 1 ha páros számú egyes, és 0 ha páratlan számú egyes van a bitsorozatban.

Például a 00110110 bitsorozat paritásbitje 1, mert 4 db 1-es van a sorozatban. A paritásbitet a bitsorozat végére fűzve küldik át:

001101101

Ha a bitsorozat valahol módosul, ellentettjére változik egy bit, akkor a paritást újra kiszámolva és összehasonlítva az átküldöttel észrevehető, hogy hibás-e az adatsor vagy sem. Sajnos ha több bit változik meg, akkor így nem mindig lehet detektáltni a hibát.

Hamming-kódolás - hibajavítás

A Hamming-kódolás 4 bit hosszúságú üzenethez hozzáadott speciálisan képzett 3 bitnyi hibajavító kódolás, ami nem csak az üzenet hibásságát fedi fel, hanem pár számítás elvégzésével megmondja hol a hiba, mely bit változott az ellentettjére.

A kód képzése (ezt nem kell tudni):

Ha az üzenet 4 bit, hosszú és bitjei a b1,b2,b3,b4 akkor ahhoz hozzáfűzünk 3 paritásbitet p1,p2,p3-at, aminek helye és képzése:

b4, b3, b2, p3, b1, p2, p1

  • p1 = b4, b2, b1 paritása
  • p2 = b4, b3, b1 paritása
  • p3 = b4, b3, b2 paritása

Redundáns adatforgalom

A fenti két módszer csak átállítódásos hibák észrevételére és javítására jó. Az eltörlődéses hibákat (amikor nem érkezik meg egy bit) csak az adat újraküldésével illetve többszöri elküldésével küszöbölhetjük ki.

Kódtáblák

A kódtáblák karakter-kód összerendelések. Nagyon fontos szerepük van az adatok eltárolásában, mert a karakteres adatokat nélkülük nem lehetne eltárolni. A betűk, mint grafikus szimbólumok csak az ember számára érdelmesek, a számítógép nem tud velük mit kezdeni. Ha egy karaktert, például az ”X”-et, megnyomtuk a billentyűzetünkön, akkor milyen adatsort küldjön el a billentyűzet a számítógépnek? A válszt valamelyik kódtáblában kell keresni!

Az egyik legelső kódtábla az ASCII kódtábla, ami a mai napig használatos. Jelkészlete az angol abc betűit, számokat, írásjeleket és vezérlő kódokat tartalmazza. Egy billentyű lenyomása egy számot generál, például az ”X” az ASCII kódtábla szerint 88-as kódú Ez a szám, pontosan ennek bináris alakja utazik fel a billentyűzet vezetékén 0-ák és 1-esek sorozatával a számítógéphez.

Az ASCII tábla manapság nem elég, mert nem csak angol, hanem más nyelveken is használjuk a számítógépet, így az ékezetes és egyéb speciális karaktereket is bele kellett venni a jelkészletbe. Sajnos ahány nagy szervezet létezik, annyi -féle kódtáblát hoztak létre. Az ASCII a számítástechnika kezdete óta van, a Nemzetközi Szabványügyi Szervezet is létrehozott egyet, a Microsoft is létrehozott egyet...

  • ASCII (American Standard Code for Information Interchange)

    • 1 byte-on tárolódik (256 karkter)
    • Jelkészlete az angol abc betűit, számokat, írásjeleket és vezérlő kódokat tartalmazza
    • Az első 128 jel rögzítve van, az minden ASCII kódtáblában ugyanaz a második 128 jel változhat (országfüggő) különböző kódlap tartozik az országokhoz.
    • 852-es kódlap Magyarországé
  • UNICODE

    • 4 byte-on tárolódik (több, mint 4 milliárd karakter)
    • A világ összes nyelvének szimbólumait tartalmazza
    • Egyik megvalósítása(móduosulata) az UTF-8 ami nem fix 4 byte-ot rendel a karakterekhez, hanem csak annyi byte-on ábrázol, amennyi pont szükséges.
  • ISO kódtáblák

    • Az ISO (International Organization for Standardization - Nemzetközi Szabványügyi Szervezet) hozta létre
    • Magyarországé.: ISO 8859-2
  • Windows kódtáblák

    • ő is felállított karaktertáblákat országok szerint
    • Magyarországé: Windows-1250

A szövegszerkesztőkben, böngészőkben és minden olyan programban ami karaktereket jelenít meg, módosít vagy ment lehetőségünk van kiválasztani, hogy melyik kódtáblát használja az karakterek értelmezéséhez.

Például egy weboldal Unicode-ban jól néz ki, mert a fejlesztője, amikor programozta, akkor UTF-8 táblát választotta ki (az Unicode altábláját), hogy abban mentse el a szövegszerkesztő a forrást.

Nyugati kódolásban más nem jól jelennek meg a karakterek: