Műveletek egész számok között

Szorzás

Bináris, előjel nélküli szorzás

Külön feladat a szorzás és osztás bináris jegyekkel, ám ha a műveletvégző egységünk képes léptetésre (a biteknek balra vagy jobbra tolása egy vagy több helyi értékkel), invertálásra, összeadásra és kivonásra, akkor a szorzás és az osztás is megvalósítható ezeknek a műveleteknek a felhasználásával.

Nézzük most két bináris szám szorzásának egyszerű, formális módját, amire később, ha szükség lesz rá, akár (mikro-) programot is írhatunk. A szorzás két bináris szám között úgy történik, hogy leírjuk egymás alá először a szorzandót, majd alá a szorzót. Mindig a szorzó LSB-jével (Last Significant Bit, legalacsonyabb helyi értékű bit) kezdjük a részszorzatok gyűjtését, és azt a szabályt alkalmazzuk, hogy ha a szorzó adott helyi értékén egy 1-es van, akkor a szorzandót változtatás nélkül leírjuk a következő sorba helyiérték-helyesen.

Egy ilyen sort mostantól nevezzünk gyűjtő sornak. Ezután eggyel balra léptetjük a „gyűjtő sorunkat” és a szorzó következő balra eső helyi értékén újra megvizsgáljuk, hogy 1 van-e. Ha 0 van, akkor a következő gyűjtő sorba (ami mindig olyan hosszú, mint a szorzandó) csupa nullát írunk. Ha 1 van, akkor az előbb ismertetett szabály szerint a szorzandót írjuk le a sorba. Ezt a műveletet a szorzó minden bitjére elvégezzük, és az így kapott gyűjtő sorokat oszlopaik szerint összeadjuk. Ez az összeg lesz a szorzat maga.

Nézzünk egy példát:

Vegyünk az egyszerűség kedvéért 2 db négybites számot. Belátható, hogy a művelet kiterjeszthető tetszőleges szélességű bitmintára.

Legyen a szorzandó decimális , vagyis bináris , a szorzó pedig , vagyis . Most egymás alá írva először a szorzandót, majd alá a szorzót a következő adódik:

5-2. ábra -

kepek/2fejezet-5-2.jpg


Ha megtekintjük a -t, akkor megérthetjük, hogy a szorzás tulajdonképpen egy kétszer olyan széles regiszterben végzett léptetésre és összeadásra vezethető vissza. Az ábrán kékkel jelöltük a helyiérték-pótló nullákat.

Az is látszik, hogy két szám szorzásához éppen kétszer akkora szélességű eredményszámító (vagy gyűjtő) tárolóhely kell, vagyis két nyolcbites szám szorzatának eredményét 16 biten lehet eltárolni (lásd )

5-3. ábra - http://gate575.hu/ITMagister/Multi/

kepek/2fejezet-5-3.jpg


bites, bináris, előjeles szorzás

Ebben az esetben már összetettebb „algoritmust” kell használnunk, mert külön kell választanunk a szorzandó és a szorzó előjelének hatását. Mivel két eset lehetséges mindkét tagnál, ezért összesen négy külön eset adódik, amiből korrekcióra igazán csak három marad, mert az azonosan pozitív előjelek mindig pozitív eredményt adnak, vagyis számolhatunk az előjel nélküli szorzásnál ismertetett módon.

Először elevenítsük fel a kettes komplemens számoknak azt a tulajdonságát, hogy úgy is származtathatók, mint egy különbség az ábrázolható legnagyobb számnál 1-el nagyobb szám értékéből. Nézzünk erre egy példát: Egy nyolc bites pozitív szám legyen 14, vagyis 0000 11102. A nyolc biten ábrázolható legnagyobb szám a decimális 255. Azt mondtuk, hogy a 14 kettes komplemense egy olyan különbség, ami a (255+1=) 256-ból való kivonással keletkezik. Ellenőrizzük: 0000 11102 kettes komplemense a formális átírással (az első egyes után minden invertálódik) 1111 00102 alakú. Ennek értéke: 128+64+32+16+0+0+2+0 = 242 és ez éppen (255+1) – 14 = 256–14 = 242.

A vizsgálandó esetek közül először vegyük azt, amikor a szorzandó negatív és a szorzó pozitív. Legyen a szorzandó abszolút értéke egy SD-vel, a szorzó abszolút értéke pedig SO-val jelölt szám. Ekkor a szorzat (ST)

ST = (-SD)∙SO

alakban írható. Ha kettes komplemensben írnánk fel a negatív (szorzandó SD) tagot, akkor ez az egyenlet az előbbiek figyelembevételével így alakulna:

ST = ( - SD) ∙ SO.

Felbontva a zárójelet adódik:

ST = ∙SO – SD∙SO.

Az eredményünk „helyigénye” éppen kétszer akkora, mint szorzandó és a szorzó egyenként, vagyis, ha azok nyolcbitesek, akkor az eredmény „elfér” 16 biten. Az eredmény értékét nem változtatja meg, ha -t hozzáadunk (ami „kilóg” az eredményregiszterből [moduló aritmetika]). Ezt azért tesszük, hogy szintén kettes komplemensben lássuk az eredményt, vagyis az egyenletünk

ST = – SD∙SO + ∙SO

alakú lesz. Ebből a (– SD∙SO) az a kettes komplemens szám, amire mint eredményre számítunk. Ugyanakkor van egy további additív tag, aminek a hatását korrigálni kell, vagyis le kellene vonni, hogy csak a – SD∙SO tag maradjon. Hát ezt is tesszük a formális megoldásnál, tehát ha a szorzandó negatív, akkor a szorzó értékét az eredményül kapott szám felső bájtjából a szorzás után le kell vonni.

Nézzünk egy példát. Legyen

SO = 0xB7= 1101 01112 = –4110 ,

SD = 0x2B = 0010 11012 = 4310.

A szorzatuk:

ST = (-41)10 ∙ 4310 = –176310 = 0xF91D.

Előjel nélküli szorzással összeszorozva: 0xB7 ∙ 0x2B = 215 ∙ 43 = 9245 = 0x241D.

Az ST előjeles szorzathoz az előbbiek szerint úgy jutunk, ha az előjel nélküli szorzat felső bájtjából (0x24) kivonjuk a szorzót (0x2B-t):

0x24 – 0x2B = 0xF9.

Vagyis az eredmény ST = 0xF91D, ami egy kettes komplemensben kapott szám, értéke −1763, ami megfelel a korábban kiszámolt elvárt eredményünknek.

Ugyanezen gondolatmenet alapján, ha a szorzó negatív, akkor a szorzandót kell kivonnunk az előjel nélküli szorzat felső bájtjából. Ha pedig a szorzandó és a szorzó is negatív, akkor mindkettőt kivonjuk a szorzat felső bájtjából.

bites, bináris, előjeles szorzás:

További általánosításként a nyolcbites eljárás könnyedén kiterjeszthető 16 bites előjeles szorzásra, melyet a segítségével nyomon követhetünk.

5-4. ábra - http://gate575.hu/ITMagister/SignMulti

kepek/2fejezet-5-4.jpg


A 16 bites előjeles szorzásnak a fentiekhez hasonlóan négy alapvető esetre való szétválasztásával – magától értetődőnek tekintve a szorzat és a szorzó pozitív eredményű szorzatát – vizsgáljuk meg a többi lehetőséget.

A szorzandó negatív esetben:

ST = (-SD)∙SO = (–SD)∙SO=∙SO – SD ∙SO =–SD∙SO +∙SO

Itt szintén a kettes komplemens alakú felírás érdekében bővítettünk egy, a moduló aritmetika miatt irreleváns taggal. A felírásból látszik, hogy az eredmény, a kettes komlemensben adott –SD∙SO tag mellett keletkezik egy olyan többlet ∙SO alakban, amit korrigálnunk kell. Vagyis, ha a szorzandó negatív, akkor a szorzó értékét ki kell vonni a szorzat magasabb helyi értékű 16 bites szavából.

A szorzó negatív esetben leírható:

ST = SD∙(-SO) = SD ∙ (–SO) =(∙SD) – SO ∙SO =–SD∙SO +∙SD

A felírásból látszik, hogy az eredmény, a kettes komplemensben adott –SD∙SO tag mellett keletkezik egy olyan többlet ∙SD alakban, amit korrigálnunk kell. Vagyis, ha a szorzó negatív, akkor a szorzandó értékét ki kell vonni a szorzat magasabb helyi értékű 16 bites szavából.

A szorzandó és a szorzó negatív esetben a következő adódik:

ST = (-SD)∙(-SO) = (–SD) ∙ (–SO) = +SD∙SO - +SD - +SO = SD ∙SO + ∙SD + ∙SO = SD ∙SO + ∙(-SD) + ∙(-SO)

A felírásból látszik, hogy az eredményül kapni kívánt SD∙SO tag mellett keletkezik két olyan többlet, a ∙(-SD), valamint a ∙(-SO), amit korrigálnunk kell. Vagyis, ha a szorzandó és a szorzó is negatív, akkor a szorzandó és a szorzó értékét is ki kell vonni a szorzat magasabb helyi értékű 16 bites szavából.

Osztás

bites előjel nélküli bináris osztás

Az előjel nélküli bináris osztás elve azonos a jól ismert decimális osztásnál alkalmazott eljárással, amikor is az osztandónak egy olyan balról vett tartományát jelöljük ki, amelyből az osztó kivonható. Majd a maradékot leírva és hozzávéve az osztandó következő értékes jegyét, ismét kivonást végzünk az osztóval. Vagyis hasonlóan a szorzáshoz, az osztást a léptetés és a kivonás műveletek sorozatával algoritmizáljuk (programozott feladatmegoldás). A ban az osztás algoritmusa nyomon követhető.

Végezzük el ugyanezt a példát az erre készült intelligens prezentáción ugyanezekkel az adatokkal. (lásd )

5-5. ábra - http://gate575.hu/ITMagister/Div/

kepek/2fejezet-5-5.jpg


A fentiekből látható, hogy az osztás első kivonására a 10100 bitminta és az 1111 (osztó) között kerül sor. Vagyis kivonunk (a piros kerettel jelölt) 20-as számból 15–öt, az eredmény 5 lesz, ami az osztás maradéka (lásd ). Ekkor az osztás eredményét jobbról egy 1-essel bővítjük. A kapott maradékhoz az osztandó jobbra eső, soron következő bitjét hozzuk le (lásd ), és ha ez az új rész nagyobb vagy egyenlő, mint az osztó, akkor megint elvégzünk egy kivonást, de most már az eddigiek alatt és eggyel jobbra léptetve a kiírást. Ha a kivonandó nagyobb, mint a kisebbítendő, akkor az osztóval azonos szélességű zérus bitmintával végezzük el a kivonást azért, hogy helyiérték-helyesen lehozhassuk a következő osztandó bitet. Ekkor az eredményt jobbról nullával bővítjük. A fenti esetszétválasztásokat, léptetéseket és sorozatos kivonásokat addig végezzük, amíg az osztandó minden bitjét fel nem dolgoztuk. Az utolsó kivonás után keletkező bináris szám a maradék.

5-6. ábra -

kepek/2fejezet-5-6.jpg


5-7. ábra -

kepek/2fejezet-5-7.jpg


bites előjeles bináris osztás

Az előjel nélküli bináris osztás tulajdonképpen az egyik esete a lehetséges előjeles osztásoknak, amikor is az osztandó és az osztó is pozitív. Az előjeles osztást is visszavezethetjük az előjel nélküli osztásra úgy, hogy az eredményeket a szorzáshoz hasonlóan korrigálnunk kell. Amennyiben az osztandó vagy az osztó negatív szám, akkor vesszük a negatív szám abszolút értékét, vagyis a kettes komplemensét, és így végezzük el az osztást. Annak az osztásra vonatkozó egyenlőségnek viszont feltétlenül teljesülnie kell, hogy az eredmény és az osztó szorzatának a maradékkal vett összege az osztót adja.

A bináris osztás tehát úgy kezdődik, hogy az osztandó, illetve az osztó előjele szerint, ha azok negatívak, akkor azok kettes komplemensét vesszük és elvégezzük (most már pozitív számok között) a korábbiakban tárgyalt előjel nélküli osztást. Ez követően az alábbi korrekciókra kerül sor:

Az előjeles osztás hányadosának előjele

  • pozitív, ha az osztandó és az osztó előjele megegyezik. Ekkor a módosított (előjel nélküli) osztás hányadosa egyben az előjeles osztás hányadosa is.

  • negatív, ha az osztandó és az osztó előjele különbözik. Ekkor a módosított (előjel nélküli) osztás hányadosának kettes komplemense lesz az előjeles osztás hányadosa.

A maradék előjele

  • pozitív, ha az osztandó előjele pozitív vagy 0. Ekkor a módosított (előjel nélküli) osztás maradéka egyben az előjeles osztás maradéka is.

  • negatív, ha az osztandó előjele volt negatív. Ekkor a módosított (előjel nélküli) osztás maradékának kettes komplemense lesz az előjeles osztás maradéka.

Vagyis az alábbi azonosságok teljesülnek, ahol OD az osztandót, OO az osztót, HD a hányadost, MD a maradékot jelöli:

(-OD)=(-OO) ∙ (HD) – MD

OD=(-OO) ∙ (-HD) + MD

(-OD)=OO ∙ (-HD) – MD

OD=OO ∙ HD + MD

Az előjeles osztás műveletét a segítségével nyomon követhetjük.

5-8. ábra - http://gate575.hu/ITMagister/SignDiv

kepek/2fejezet-5-8.jpg