Nyomtatás

Tamás Ferenc: Bináris számábrázolás

Számrendszerekről általában

A sikeres és gyors bináris számábrázoláshoz feltétlenül meg kell érteni a számrendszereket! A legegyszerűbb, legáltalánosabban használt a tízes számrendszer. Alapja: 10. Számjegyei: 0, 1, 2, 3, 4, 5, 6, 7, 8 és 9. Másik neve: decimális számrendszer. Mivel a hétköznapokban is ezt használjuk, ezért erről most nem szeretnék többet írni.

A számítástechnikában általánosan használt számrendszer a kettes, vagy bináris. Itt az alap: 2. Használt számjegyek: 0 és 1. Nagyon fontos, hogy bár az informatika alapja a bináris számrendszer, de ettől függetlenül sokkal egyszerűbb a tizenhatos, avagy a hexadecimális rendszert használni. A rendszer alapja: 16. Használt számjegyek: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10=A, 11=B, 12=C, 13=D, 14=E és 15=F. Az egyszerűbb megjegyzéshez nyugodtan használhatjuk a következő (ujjakkal mutatott) példát:

 

 

10

11

12

13

14

15

A

B

C

D

E

F

10

11

12

13

14

15

(Képek forrása: http://en.wikipedia.org/wiki/Finger_binary )

Mivel sokat fogjuk használni, ezért érdemes külön definiálni a 8-as, vagy oktális rendszert. Itt az alap: 8. Használt számjegyek: 0, 1, 2, 3, 4, 5, 6 és 7. (Megj.: ezt legtöbbször Linux operációs rendszerek jogai esetében használjuk, de máskor is jól jön.)

Természetesen van még igen sok, máshol még fellelhető számrendszer is. Gondoljunk itt például az angolszász nyelvekben gyakori 12-es rendszerre! (pl.: angolban 10=ten, 11=eleven és 12=twelve, de már a 13=thirteen) Előfordulhat még az ókori Babilonban előfordult 60-as rendszer, amely mind a mai napig az óra perceiben és a perc másodperceiben köszön vissza. Ám az informatikában szinte kizárólagosan ez a 4 rendszer fordul elő.

Átváltás a tízes számrendszerre

A különböző számrendszerek között gyorsan és rugalmasan kell tudnunk átváltani. Ezek közül a legegyszerűbb művelet a 10-re való átváltás.

Vegyük először a kettő hatványait: (javaslat: 21-210 között az értékeket érdemes megtanulni, legalább sorban...)

20

21

22

23

24

25

26

27

28

29

210

1

2

4

8

16

32

64

128

256

512

1024

 

Vegyünk most egy egyszerű bináris számot: 10012.
A jegyek értéke sorrendben a következő: 1*23+0*22+0*21+1*20 = 1*8+0*4+0*2+1*1 = 8+0+0+1 = 9. Tehát: 10012 = 910
Így az átszámítás kicsit nehézkesnek tűnik, de pár példa után menni fog!

 

Második példa legyen egy 8-jegyű bináris szám: 1010.01112.

(Megjegyzés: A 4. bináris számjegy után nem kellene pont, de így a szám könnyebben olvasható.)

Itt is az előzőhöz hasonlóan járunk el:
1*27+0*26+1*25+0*24+0*23+1*22+1*21+1*20 =

A fenti hatvány-táblázatot ismételten használva átírjuk a hatványokat:
= 1*128+0*64+1*32+0*16+0*8+1*4+1*2+1*1 =

Most végezzük el a szorzásokat:
= 128+0+32+0+0+4+2+1 = 16710.

Tehát: 1010.01112 = 16710.

Tapasztalatom szerint ezt a matematika iránt fogékonyak egyből megértik, de sokszor el szokták számolni és az 5.-10. gyakorló feladat között elmegy a kedvük az egésztől, mert megunják. Ezért van egy kicsit szemléletesebb, de nem feltétlenül gyorsabb módszerem! A példaként vett szám legyen ugyanaz, mint az előbb!

 

Kezdésnek vegyünk fel egy 5*8-as táblázatot a következő formátumban:

Kitevő

Hatvány

Érték

Számjegy

Szorzat

0

 

 

 

 

1

 

 

 

 

2

 

 

 

 

3

 

 

 

 

4

 

 

 

 

5

 

 

 

 

6

 

 

 

 

7

 

 

 

 

Itt értelemszerűen annyi sor kell, ahány jegye van a bináris számnak.

Második lépésben írjuk fel a 2 hatványait – egyelőre csak hatványalakban!

Kitevő

Hatvány

Érték

Számjegy

Szorzat

0

20

 

 

 

1

21

 

 

 

2

22

 

 

 

3

23

 

 

 

4

24

 

 

 

5

25

 

 

 

6

26

 

 

 

7

27

 

 

 

Harmadik lépésben fentről lefelé töltsük ki a harmadik oszlopot – a többség hajlandó megjegyezni a kettő hatványait így, sorban. Tehát most itt állunk:

 

Kitevő

Hatvány

Érték

Számjegy

Szorzat

0

20

1

 

 

1

21

2

 

 

2

22

4

 

 

3

23

8

 

 

4

24

16

 

 

5

25

32

 

 

6

26

64

 

 

7

27

128

 

 

Negyedik lépésben írjuk be az átváltani kívánt bináris szám jegyeit a sorrendre ügyelve! A legalsó sorba kerül a legnagyobb értékű jegy, majd a többi egyesével fölé.

Kitevő

Hatvány

Érték

Számjegy

Szorzat

0

20

1

1

 

1

21

2

1

 

2

22

4

1

 

3

23

8

0

 

4

24

16

0

 

5

25

32

1

 

6

26

64

0

 

7

27

128

1

 

Ötödik lépésben pedig az utolsó két kitöltött oszlop értékeit szorozzuk össze!

Így a helyesen kitöltött táblázat:

Kitevő

Hatvány

Érték

Számjegy

Szorzat

0

20

1

1

1

1

21

2

1

2

2

22

4

1

4

3

23

8

0

0

4

24

16

0

0

5

25

32

1

32

6

26

64

0

0

7

27

128

1

128

Ezek után csak az utolsó oszlopot kell összeadnunk! Sajnos a számológéphez szokott mai ifjúság ezt is gyakran elvéti. Ezért javaslom, hogy egyszerre csak 2-3 számot adjanak össze. A következő táblázatban az első három számot adtuk össze, majd külön képeztük az utolsó két – nem zérus szám - összegét:

Kitevő

Hatvány

Érték

Számjegy

Szorzat

Összeg

0

20

1

1

1

 

7

1

21

2

1

2

2

22

4

1

4

3

23

8

0

0

 

160

4

24

16

0

0

5

25

32

1

32

6

26

64

0

0

7

27

128

1

128

Így más a végső összeg is tévesztés nélkül megvan: 167.

 

Most ugyanezzel a táblázatos módszerrel számoljuk ki a következő bináris szám decimális értékét: 1110.10102!

Kitevő

Hatvány

Érték

Számjegy

Szorzat

Összeg

0

20

1

0

0

10

1

21

2

1

2

2

22

4

0

0

3

23

8

1

8

4

24

16

0

0

96

5

25

32

1

32

6

26

64

1

64

7

27

128

1

128

128

Végső összegzés: 10+96+128 = 106+128 = 234.

Tehát: 1110.10102 = 23410.

 

Használjuk fel ugyanezt a táblázatot egy oktális szám átváltására is! Az alapszám legyen a következő: 64318 !

Kitevő

Hatvány

Érték

Számjegy

Szorzat

Összeg

0

80

1

1

1

 

25

1

81

8

3

24

2

82

64

4

256

 

3328

3

83

512

6

3072

Végső összeg: 25+3328 = 3353. Tehát: 64318 = 335310.

 

Most hasonlóan járjunk el a következő hexadecimális számmal is: 2AD416 !

 

Kitevő

Hatvány

Érték

Számjegy

Szorzat

Összeg

0

160

1

4

4

 

212

1

161

16

D =13

208

2

162

256

A = 10

2560

 

10752

3

163

4096

2

8192

Így a végső összeg: 10964. Tehát: 2AD416 = 1096410 .

Megjegyzés: A számítástechnikai szakirodalomban nagyon gyakori, hogy a hexadecimális számrendszerű számot nem a hagyományos matematikai jobb alsó sarokba írt 16-tal jelölik, hanem a szám elé írt $ jellel, tehát 2AD416 = $2AD4.

 


 

Decimális átváltása binárisra

(Azaz tízes átváltása kettesre)

Amilyen fontos volt az előző irány, olyan lényeges lesz annak fordítottja is. Először nézzük a legegyszerűbb esetet: 25110 = ? 2.

Legelső lépésben azt kell eldönteni, hogy 2 hányadik hatvány fér még bele a számba, tehát keressük azt a hatvány, ami a számnál nem nagyobb, de a következő hatvány már nagyobb.

Ehhez megint vegyük elő a jól ismert táblázatot:

20

21

22

23

24

25

26

27

28

1

2

4

8

16

32

64

128

256

Látható, hogy az átváltani kívánt szám (251) nagyobb, mint 128, de kisebb, mint 256. Így megvan benne a 128 (1-szer), maradék a 123. Tehát legelső jegy az 12.

A maradékkal ugyanezt eljátsszuk. Megvan benne a 64 (1-szer), maradék az 59. Tehát a második jegy: 1. A szám eddig: 112.

A maradék most 59, melyben a 32 megvan (1-szer), maradék a 27. Így a harmadik jegy megint: 1. A szám jelenleg: 1112.

Újabb osztás következzen! A 27-ben megvan a 16 (1-szer), maradék a 11. Így a negyedik jegy is: 1. A szám jelenleg: 11112.

Következő fordulóban a 11-et osztjuk 8-cal. Megvan 1-szer maradék a 3. A szám jelenleg: 111112.

Most a 4-gyel való osztás következik, de a 3-ban nincs meg a 4, így a következő jegy: 0. Tehát a szám jelenleg: 11.11102.

A 3-ban megvan a 2 (1-szer), tehát az utolsó előtti jegy megint 1 lesz, míg a végső maradék megint 1, tehát most már leírhatjuk a végső számot: 1111.10112.

 

Nézzük mindezt egy újabb táblázatban!

Szám

Hatvány

Jegy

Maradék

251

128

1

123

123

64

1

59

59

32

1

27

27

16

1

11

11

8

1

3

3

4

0

3

3

2

1

1

1

1

1

1

Így a helyes végeredmény: 25110 = 1111.10112. Ne feledjük el, hogy a számot fentről lefelé kell összeolvasni. Kitöltés közben azért nem árt észrevenni, hogy az előző sor vége mindig megegyezik a következő sor elejével (ez a maradék újra felhasználása).

 

Legyen most egy újabb szám, mégpedig a 14910. Ismét használjuk a fenti táblázatot!

Szám

Hatvány

Jegy

Maradék

149

128

1

21

21

64

0

21

21

32

0

21

21

16

1

5

5

8

0

5

5

4

1

1

1

2

0

1

1

1

1

0

Tehát a helyes átváltás: 14910 = 1001.01012.


Decimális átváltása hexadecimálisra

Ez az irány első látásra sokkal nehezebb, de nem kell aggódni, mivel erre is van egy (viszonylag) egyszerű módszer. Legyen a kiindulás a 969010.

A 9690-ben a 163=4096 van meg a 16 hatványai közül, mivel a 164=65536 már túl nagy. Hányados: 2. Maradék: 1498. Ezt 256-tal el kell osztani. Hányados: 5. Maradék: 218. A következő lépésben 16-tal kell osztani, a hányados 13 lesz, ami D-nek felel meg. A maradék pedig 10. Ez pedig az utolsó jegy lesz, ami a hexadecimális rendszerben A-nak felel meg. Ugyanez a hagyományos táblázatban így néz ki:

Szám

Hatvány

Jegy

Maradék

9690

4096

2

1498

1498

256

5

218

218

16

13 = D

10

10

1

10 = A

0

Tehát a teljes átváltás: 969010 = 25DA16 = $25DA.

 

Nézzünk most egy másik átváltást! Eredeti tízes számunk legyen a 2011. Ezúttal csak a táblázatot nézzük!

Szám

Hatvány

Jegy

Maradék

2011

256

7

219

219

16

13 = D

11

11

1

11 = B

0

Tehát a teljes átváltás: 201110 = 7DB16.

 

Most nézzünk egy komolyabb számot, a 1140305510-t.

Szám

Hatvány

Jegy

Maradék

0

165=1048576

10=A

917295

917295

164=65536

13=D

65327

65327

163=4096

15=F

3887

3887

162=256

15=F

47

47

161=16

2

15

15

160=1

15=F

0

Tehát a teljes átváltás: 1140305510 = ADFF2F16.

 

Ez nem feltétlenül könnyű, ezért van egy kicsit bonyolultabb, de sokkal könnyebben végrehajtható módszer. Lényege: először a tízes számrendszerű számot áttesszük binárisba (kettesbe), majd a következő lépésben a bináris számot rakjuk át hexadecimálisba!

Szám

Hatvány

Jegy

Maradék

1333

1024

1

309

309

512

0

309

309

256

1

53

53

128

0

53

53

64

0

53

53

32

1

21

21

16

1

5

5

8

0

5

5

4

1

1

1

2

0

1

1

1

1

0

Tehát az átváltás: 133310 = 101.0011.01012. Most pedig jöjjön az átváltás!

Persze erre is van egy aprócska kis táblázat!

Tízes

0

1

2

3

4

5

6

7

Bináris

'0000

'0001

'0010

'0011

'0100

'0101

'0110

'0111

Hexa

0

1

2

3

4

5

6

7

Tízes

8

9

10

11

12

13

14

15

Bináris

1000

1001

1010

1011

1100

1101

1110

1111

Hexa

8

9

A

B

C

D

E

F

Tehát a teljes átváltás: 101.0011.01012 = 53516.

Hasonlóan könnyű a 8-as átváltás, ráadásul a számjegyek is megegyeznek az első sorban lévőkkel. Annyit érdemes megtenni az átváltandó bináris számmal, hogy a szokásos négy jegyenkénti pontozás helyett válasszunk 3 jegyenkéntit.

101.0011.01012 = 10.100.110.1012 = 24658.

Gyakorlásul érdemes az összes eddigi számot ezzel a módszerrel újra átváltani.

Most már rátérhetünk a gyakorlati témára: a bináris számábrázolásra!


Egészek bináris ábrázolása

Kezdjük a pozitív egészekkel, bár ez egy meglehetősen ritka módja a számábrázolásnak, de azért előfordul egyes operációs rendszerekben, illetve programozási nyelvekben. A legtöbb számábrázolási módszerrel ellentétben itt nincsen előjelbit (mivel a pozitívon nincs mit ábrázolni), csak pusztán a szám. Pl. az 1 bájtos számokban a következő a megoldás:

Bit

7

6

5

4

3

2

1

0

Jegy

1

0

1

0

1

0

1

0

Tehát a teljes szám: 101010102, ami átváltva 17010-nel felel meg. A helyzet ugyanez lesz, ha 1 bájt helyett 2 bájtnyi lesz a bináris szám. Nézzük most a következő számot:

EC3D16 = 1110.1100.0011.11012 = 6047710

A teljes szám ábrázolása most így néz ki:

Hexa

E

C

3

D

Bit

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Jegy

1

1

1

0

1

1

0

0

0

0

1

1

1

1

0

1

 

Most térjünk át az előjeles egészekre! Itt a legelső bitet az előjel foglalja le, ami általában 0, ha a szám pozitív, míg 1, ha a szám negatív. Itt is kezdjük az 1 bájtos számokkal! A példa: +110.01102.

Bit

EJ

6

5

4

3

2

1

0

Jegy

0

1

1

0

0

1

1

0

(EJ = előjelbit)

Tehát így a legnagyobb ábrázolható pozitív szám: +111.11112. Ezt átváltva a 12710-et kapjuk.

1 bájton ábrázolt negatív számok esetén ábrázoljuk a -6110-et:

Bit

EJ

6

5

4

3

2

1

0

Jegy

1

0

1

1

1

1

0

1

Tehát a bináris megfelelője: -11.11012. A 6-os biten lévő 0-t nem szokás leírni, mivel a számok (leírt formátumban) nem kezdődnek 0-val.

Így a legkisebb ábrázolható egész szám: -111.11112 lesz, ami -12710-nek felel meg.

Két bájton a módszer hasonló, csak itt a legelső bit lesz az előjel.

Bit

EJ

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Jegy

0

1

1

0

1

1

0

0

1

0

0

1

0

1

0

1

Ez a szám a következő lesz: +110.1100.1001.01012. Átváltás után: 6C9516, ami 2779710-nek felel meg. A legnagyobb ábrázolható egész szám: +111.1111.1111.11112 = 7FFF16 = 3276710.

A legkisebb pedig a következő: -111.1111.1111.11112 = - 7FFF16 = - 3276710.

Ebben a módszerben egyetlen gond az, hogy 2 db 0 van, mégpedig egy pozitív és egy negatív 0, ez pedig komoly gondot szokott okozni.

 

Ezért jön a következő módszer, a komplemens kódú ábrázolás. A módszer matematikai alapja az, hogy ha egy tetszőleges hosszú bináris számot összeadunk kettes komplemensével, akkor az összegként kapott szám minden jegye 1 lesz.

a

1

0

1

1

0

1

0

1

Komp a

0

1

0

0

1

0

1

0

Összeg

1

1

1

1

1

1

1

1

Így az összeg 28-1 lesz. Tehát egy szám komplemensét megkaphatjuk úgy is, hogy a számot kivonjuk a 28-1-ből. A kettes komplemens kódban ábrázolt bináris szám legnagyobb helyiértékű bitjét (az előjelbitet) negatívnak kell tekinteni. Egy bináris szám kettes komplemensét úgy képezhetjük legegyszerűbben, hogy a szám inverzéhez hozzáadunk 1-et. Ilyen módszerrel viszont igen könnyű lesz a számítás. Vegyünk erre egy példát!

Bit

7

6

5

4

3

2

1

0

Hatvány

27

26

25

24

23

22

21

20

n = 8

0

0

0

0

1

0

0

0

N = -9

0

0

0

0

1

0

0

1

N inverze

1

1

1

1

0

1

1

0

Érték

-27

+26

+25

+24

0

+22

+21

0

Összegezve: -27+26+25+24+22+21 = -128+64+32+16+4+2+1 = -128 +119 = -9

Tehát a komplemens módú ábrázolásnál megszűnik a két db nulla, viszont az értékek visszaszámítása a hagyományos tízes számrendszerbe kicsit bonyolultabb lesz. Az ábrázolható értékek is a következők lesznek (1 bájton): -128 <= x <= +127.


Fixpontos számábrázolás

Ennél a módszernél előbb egy is matematika szükséges. Vegyünk egy egyszerű számot: +12,75. A számot három részre fogjuk bontani: az előjel (+), az egész rész (12) és a törtrész (0,75). Mindegyiket külön-külön fogjuk ábrázolni a következő táblázat segítségével:

Előjel

Egészrész

Törtrész

215

214...28

27...20

Az egészrész és a törtrész határán van egy nem ábrázolt bináris pont (magyarul: tizedesvessző).

A fenti példa egy 16 bites (2 bájtos) számra vonatkozik, ahol 1 előjelbitet 7 egészrész-bit követ, majd jön 8 törtrész-bit. Ezek az értékek lehetnek mások is, pl. 15 egészrész-bitet követhet 16 vagy 24 törtrész-bit is – ez csak az operációs rendszer, illetve az adott programozási nyelv rendszerétől függ. Mi most maradjunk a fenti 1+7+8 bitnél!

Miután pozitív számot ábrázolunk, ezért az előjelbit legyen pozitív-jelű, tehát 0. A 12 átalakítása megint igen könnyű, eredménye: 000.11002. A törtrésszel kicsit többet kell törődnünk mivel ott a tízes rendszerben megszokott 0,1 és 0,01 helyett ½, illetve ¼ lesz az érték. Szerencsére az ábrázolni kívánt 0,75 éppen kifejezhető az első két tört-helyiérték összeadásával, tehát a kész törtrész-bájt a következő lesz: 1100.00002. Így most már összerakhatjuk a teljes számot:

12,7510 = 0000.1100.1100.00002.

Megjegyzés: ha az ábrázolni kívánt szám negatív, akkor mind az egészrésznek, mind a törtrésznek a vennünk kell a kettes komplemensét.


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

Itt megint egy kis matematikával kell kezdeni, mégpedig a valós számok normálalakjával. Mindenki találkozott már a 6*1023 számmal. Ez három részből áll: a szorzó (6), a hatványalap (10), illetve a kitevő (23). Ezt kell átírnunk kettes alapú hatványra, illetve kitevőre, pl.: r*2m. Még mielőtt nekifognánk a konkrét átszámításnak, tisztázni kell a normalizálás fogalmát! Ennek lényege, hogy a kettes hatvány előtt álló szorzót (a példában: r) 0 és 1 közé kell hozni – persze előjelet is lehet hozzá illeszteni. Hogy a dolog érthetőbb legyen, lássunk néhány 10-es alapú példát:

123,456 = 0,123456 * 103

-0,00789 = -0,789*10-2

6*1023 = 0,6*1024

Matematika nyelvén megfogalmazva a feltételek az r*2m képletben: 0<=r<1 és m egész szám.

Példaként vegyünk egy 32 bites valós számot. Itt az előjelbit (a számé): 1 bit. A kitevő (m) 8 bit, míg a maradék 23 bit lesz a valós szám szorzója, ami a példában r néven szerepelt. A dolog annyiban bonyolódik, hogy a bináris számábrázolás miatt az r értékét addig toljuk el, amíg ½ <= r <1 közé esik. Így viszont az r értéke mindig 1-es bittel kezdődik, amit így felesleges ábrázolni. (Ezt az elhagyott bitet hívják implicitbit-nek.

 

Tekintsük példának a következő számítógépes számot: 0.10000011.10111001000100000000000.

A legelső számjegy nulla, ami azt jelenti, hogy a szám pozitív. A következő 8 bit 10000011, amely adja az eltérített exponenst, a következő decimális számmal egyenértékű:

Kitevő = 1*27+0*26+0*25+0*24+0*23+0*22+1*21+1*20 = 128+2+1= 131.

Tehát a kivető: 131-127 = 4, pontosabban számként felírva: 2131-127 = 24. Az utolsó 23 bit a szorzót határozza meg: 10111001000100000000000.

Szorzó = 1*2-1+1*2-3+1*2-4+1*2-5+1*2-8+1*2-12 = 1/2+1/8+1/16+1/32+1/256+1/4096 = 0,722900390625.

Így a fenti számsor összesítve a következőt jelenti:

Előjelbit * 2Kitevő-127*(1+Szorzó) = + 2131-127*(1+0,722900390625) = 16*1,722900390625 = = 27,56640625

Ezzel a módszerrel elég gyorsan és jól tudnak működni a CPU-k, így végrehajtáskor szinte észre sem vesszük a számítások elvégzését.

 

Persze egyes operációs rendszerek, illetve programozási nyelvek ettől kicsit eltérő módszert is alkalmazhatnak, például a kitevő hossza 8 helyett 16 vagy 24 bit is lehet, míg a szorzó hossza a fenti példa 23 bitjével ellentétben lehet 47, illetve 71 bit is. A módszernek azért vannak korlátai! Lehet túlcsordulás, amikor a szám nagyobb, mint az ábrázolható maximum (2max_kitevő-nél is nagyobb), illetve alulcsordulás, amikor a szám kisebb, mint az ábrázolható legkisebb kitevő (2-max_kitevő), de ezek a számok vagy túl nagyok, vagy igen kicsik, azaz szinte nulla. A legtöbb programozási nyelvben van lehetőség egy a megszokott valós számoknál nagyobb csoport, illetve számábrázolási módszer választására. Ilyen lehet például a duplapontos valós szám, ami már egész nagy kitevőkig is pontos értéket ad.

 

 

Tisztelt Olvasó! Köszönöm figyelmét, mellyel ezt a cikket végigolvasta. Kérem, ha valami megjegyzése vagy kérése van, vagy valami félreértelmezhető (esetleg hibás) anyagot fedezett fel, na habozzon és feltétlenül küldje el nekem írásban ezen link segítségével. Előre is köszönöm!

 

Használt szakirodalom:

 

©TFeri.hu, 2011.
Újraszerkesztve: 2016 és 2020.