Bináris számábrázolás

Innen: HamWiki

A bináris jel

A bináris szám elemi értéke kétféle lehet: 0 vagy 1. Vezetéken nézve logikai jelszintről beszélünk, amelynek értéke L (low) vagy H (high) logikai érték.

A jelszintek feszültségtartománya attól függ, milyen logikáról beszélünk.

  • TTL logika esetén 0,8 V alatt L szint, 2 V felett H szint. Közte határozatlan.
  • CMOS esetén a tápfeszültség 1/3-a alatt L, a 2/3-a felett H szint. Közte határozatlan.

Több bináris jel és értelmezése

Ahogy a tízes számrendszerben megszokott, hogy több helyiértéket írunk egymás mögé, ugyanúgy vezethetünk többet is a fent ismertetett kétállapotú jelvezetékekből. Ekkor adatbuszról beszélünk. A leg alapvetőbb két feltétel akár tízes, akár kettes számrendszerről legyen is szó:

  • ne keverjük össze a helyiértékeket, vezeték esetén a logikai jeleket szállító vezetékek sorrendjét
  • nem mindegy, hogy jobbról balra, vagy balról jobbra olvassuk a számjegyeket, a többvezetékes buszon nevezzük a felső helyiértéket MSB-nek (most significant bit), a legalsó helyiértéket LSB-nek (least significant bit).

Az így kapott N bit széles buszon összesen 2N féle állapot, azaz ennyi érték ábrázolható. Például 8 bit esetén 28 = 256 (0..255 vagy kettes komplemens ábrázolásnál -128 .. +127), míg 12 bit esetén 212 = 4096 (0..4095 vagy kettes komolemens ábrázolásnál -2048..+2047) egész érték jeleníthető meg. És így tovább.

Konverzió más számrendszerre

Tizenhatos számrendszer

A sok-sok egymás után írt '110100100101' bináris értékek emberi szem számára nehezen olvashatók a túl sok jel miatt. Így helyette gondolatban 4 bitenként csoportosítjuk a biteket. Ezáltal az előző számsor '1101 0010 0101'-ként látható. Az elemi 4 bites csoportok pedig 0..15 közé eső értékkel írhatók le, amit a gyakorlatban a jól bevált 0..9 számjegyekkel, majd a..f betükkel írunk le. Ezáltal a példában ismertetett számsor értékei: 13, 2, 5, amit egyszerűen d25. Gyakran előfordul, hogy 0..9 közé esik minden számjegye, ami által önmagában nem látjuk belőle, hogy tizes vagy 16-os számrendszerként értelmezendő számmal van-e dolgunk. Ennek feloldása érdekében eléírunk egy számrendszert jelölő betűt vagy betűpárost.

  • 2-es (= bináris, bin) számrendszer esetén a 0b előtag, például 0b110100100101 vagy 0b.1101.0010.0101 írásforma a szokásos
  • tízenhatos (= hexadecimális, hex) számrendszer esetén a 0x előtag, például 0xd25 vagy 0x0d25 ill. 0x00000d25 utóbbiakkal jelezve hogy 16 ill. 32 bites busz fogja szállítani a számot.
  • tízes (= decimális, dec) számrendszer esetén: semmi, ahogy a 'hétköznapi' életben megszoktuk.

Tízes számrendszer

Kettő lehetséges módszer terjedt el:

  • BCD ábrázolás, ahol a 4 bitenként csoportosított bináris jel csak 0..9 (0b0000..0b1001) közötti értéket vehet fel, és például ha 7+5 összeadást végezzük el (0b0111 + 0b0101 = 0b1100), akkor rögvest kivonunk a kapott értékből 10-et (0b1100-0b1010) és a maradék lesz az utolsó helyiérték, a magasabb pedig 1-gyel növekszik. Azaz 0x12 értéket vesz fel. De kijelzőre íráskor egyszerűen '12'-t írunk, hiszen bináris jelként 4 bitenként csoportosítva a a tízes számrendszerbeli digiteket ábrázoltuk a számolások során 0..9 értékek között.
  • binárissá alakítani (a 4 bitenként csoportosított bitek 0..9 és a..f értékkészletet egyaránt felvehetik), binárisan elvégezni a számítást, adat továbbítását, stb, a megjelenítéskor pedig visszaalakítani tízes számrendszerbe. Előnye: egyszerűbb a processzornak vele számolni, azonban tízes->bináris konverzió és a bináris->tízes konverzió nehézkes.
Konverzió tízes - tizenhatos

Például konvertáljuk a 345 értéket 16-os számrendszerbe:

érték = (('3' * 10 + '4') * 10) + '5'
érték = ((0b0011 * 0b1010 + 0b0101) * 0b1010) + 0b0101 = 0b.0001.0101.1001 (= 0x159)
Konverzió tizenhatos - tízes
Kiindulás például a fenti, 0b.0001.0101.1001 = 0x159 érték átalakítása:
Osszuk el 10-zel a 0x159-et: 0b.0001.0101.1001 / 0b1010 = 0b.0010.0010 (= 0x22)
Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x159-ből. A maradék az utolsó számjegy.
Osszuk el 10-zel a 0x22-őt: 0b.0010.0010 / 0b1010 = 0b.0011
Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x22-ből. A maradék az utolsó előtti számjegy.
Osztás itt már nem kell, mert az eredmény 10 alatti, azaz megvan a legfelsőbb számjegy, ami a 3.

Mint látszik, ez a konverzió nehézkes, ezért egyszerűbb számításoknál BCD aritmetikát használnak inkább a binárissá konvertálás - bináris aritmetika - decimálissá konvertálás helyett. Bonyolultabb számítások esetén azonban a konvertálás és a bináris számokkal való számolás a hatékonyabb.

Egyszerű műveletek bináris jelekkel

Jelenként végzett logikai alapműveletek

NOT, AND, OR, XOR, ... Lásd: Logikai alapműveletek

Kettes komplemens képzés

Negatív számok bináris ábrázolásánál szükséges. Lényege: legfelső bit a helyiértékének megfelelő súllyal, ám negatív irányban van értelmezve. Például 8 bites érték esetén a legfelső bit nem 128-at ér, hanem -128-at. Így az ábrázolható értéktartomány 0..255 helyett -128..+127 között értelmezendő.

0...127 (0x00..0x7f) között semmi különbség nincs az előjel nélküli ábrázolás és az előjeles között. Azonban a -1 érték a 0xff és a -128 érték a 0x80. Erre az aritmetikai műveleteknél tekintettel kell lenni, ahogy arra is, hogy a legfelső bitre semmiképp nem csordulhat rá alatta levő bitről érték - mivel ez a bit máshogy lesz ebben az esetben értelmezve.

Összeadás

  • Bináris 0+0 = 0
  • Bináris 0+1 vagy 1+0 = 1
  • Bináris 1+1 = 0 és lesz egy átvitel a magasabb helyiértékre.

A fenti annyival bonyolódik, hogy az alsóbb helyiértékről származó átvitelt is adott esetben még hozzá kell adni.

Például: 5+7 = 12

 0b0101
+0b0111
--------------------- alább lépésenként, ahogy általános iskolában tanultuk
      0 átvitel van
     00 átvitel van
    100 átvitel van
 0b1100 nincs átvitel

Kivonás

Például: 7-5 = 2

 0b0111
-0b0101
--------------------- alább lépésenként, ahogy általános iskolában tanultuk
      0 nincs átvitel
     10 nincs átvitel
    010 nincs átvitel
 0b0100

Például: 5-7 = -2

 0b0101
+0b0111
--------------------- alább lépésenként, ahogy általános iskolában tanultuk
      0 nincs átvitel
     10 átvitel van
    110 átvitel van
 0b1110 és tényleg --> 6-8 = -2

Szorzás

Például: 5*7 = 35

     0b0101 * 0b0111
 ----------
       0101
      0101
     0101
    0000
 ----------
 0b00100011  = 0x23 = 35

Osztás

Például: 35/7 = 5

 0b00100011 : 0b0111
 ----------
   0        : 0
   00       : 0
   001      : 0
   0010     : 0
   00100    : 0
   001000   : 1 0b1000 - 0b0111 = 0b0001
   000001
   0000011  : 0
   00000111 : 1 0b0111 - 0b0111 = 0 (nincs maradék sem - ami törtként tovább lenne osztható)
 ---------------
 a jobboldali függőleges ki is adja az 5-öt, ami az eredmény

Lebegőpontos számábrázolás

Az előző részben ismertetett megoldással egész és tört számokat is lehet ábrázolni. Elég ha arra gondulunk, hogy 32 bites bináris számból

  • 24 bitet tartunk fel egész értékek számára, 0..16 millió közti értékek kifejezésére (vagy ±8 millió)
  • 8 bitet pedig 0,004 pontosságú törtrész számára.

Jó lenne, ha például 65000 alatti értékek esetén 0,000015 finomsággal tudnánk törtet ábrázolni. Azaz a törtrész pontosságát a szám nagyságának függvényében hanyagolni illetve finomítani lehetne. Erre megoldás a lebegőpontos számábrázolás.

Hogyan néz ki a lebegőpontos szám?

Képzeljük el, hogy

  • egy 1,0000 és 1,99999 közötti pontos értéket ábrázolunk, ezt nevezzük mantisszának.
  • és a fenti értéket 2±valahányadikon hatvánnyal szorzunk, ezt nevezzük exponensnek.

Például 32 bites számhossz esetén

  • 24 bitet használjunk fel mantisszának, azaz (1,)0100.0110.101 (azaz 23 bitnyi tört - amely a pontosságot adja)
  • 8 bitet pedig exponensnek, azaz 2-128..2127 nagyságrend ábrázolásig

Az 1, azért van zárójelben, hiszen ennek ábrázolása szükségtelen, mivel a mantissza minden esetben 1,000...1,999 érték közötti értéket vesz fel - így a számításokkor ez fixen bináris '1' értékű, és azt a tényt, hogy nagyon-nagyon kicsi vagy nagyon-nagyon nagy, azt az exponens határozza meg. A mantissza legfelső bitje ezért felesleges. Azonban felhasználható előjelhez a kettes komplemens számábrázolás szabályai alapján.

Magasabbrendű műveletek

Sok függvény vagy eljárás kiszámítását nem lehet egy-egy egzakt osztással meghatározni. Azonban ezeknek a függvényeknek a pontos értékei fokozatosan közelíthetők a Taylor-soraikkal. Mielőtt nagyon furcsa szemekkel néznénk erre a tudományra, a Taylor-sor napjainkban már középiskolai tananyag, azonban összetettsége túlmutat a rádióamatőr témákon. Akit bővebben érdekel, itt olvashat róla és néhány alapvető függvény kiszámításáról.

Ami a lényeges számunkra:

  • sin(x)
  • cos(x) ---> tan(x) = sin(x)/cos(x)
  • arctg(x). Érdekessége az arkusztangensnek, hogy arctg(1) éppen a π/4. Ez az egyik módszer a π közelítő kiszámításának.
  • ln(x) ---> természetes logaritmus. Ha log(), azaz tízes alapú logaritmus kell, akkor ez így számolható: log(x) = ln(x)/ln(10)
  • ex --> ha ab érték kell, ebből kiszámítható: [math]a^b = e^{ln(a) \cdot b}[/math]
  • N. gyökvonás és N. hatvány: Hatványról volt szó. Gyökvonás ugyanígy zajlik, azonban az alap logaritmusát nem szorozzuk a kitevővel, hanem osztjuk. Azaz [math]\sqrt[b]{a} = e^{\frac{ln(a)}{b}}[/math]