Binär aritmetik TSIU02 Datorteknik

Binär aritmetik
TSIU02 Datorteknik
—
Michael Josefsson
Version 1.2
Innehåll
1. Addition och tvåkomplement
1.1. Talbaser . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Addition . . . . . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.3. Talrepresentationer . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.4. Basen 210 . . . . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.5. Höger- och vänsterskift . . . . . . . . . . . . . . . . .
1.6. Omvandling från binär till decimal form och tvärtom
Exempel . . . . . . . . . . . . . . . . . . . . .
1.7. Hexadecimal representation . . . . . . . . . . . . . .
1.7.1. Omvandling binär till hexadecimal form . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.7.2. Olika skrivsätt . . . . . . . . . . . . . . . . .
1.7.3. Omvandling hexadecimal till decimal form . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.8. Negativa binära tal . . . . . . . . . . . . . . . . . . .
1.9. 2-komplement . . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
Två anmärkningar . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.10. Aritmetiska operationer: addition, subtraktion, skift
1.11. Ett hjälpmedel: cirkulärgrafen . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
1.11.1. Spill . . . . . . . . . . . . . . . . . . . . . . .
1.12. Hårdvara . . . . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
2. Multiplikation
2.1. Multiplikation — snitsigare metod . . . . .
Matematisk beskrivning av metoden
2.2. Men tvåkomplement då? . . . . . . . . . . .
2.2.1. Utökat talområde . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
6
7
7
8
8
9
9
10
10
11
12
12
12
13
13
13
13
14
14
15
16
16
17
18
18
18
19
21
.
.
.
.
23
26
26
28
29
3
Innehåll
Exempel . . . . . . . . . . . . . . .
2.2.2. Spillkompensering av (a + b)/2 . .
Metod 1 — Med utökat talområde
Exempel . . . . . . . . . . . . . . .
Metod 2 — Utan utökat talområde
Exempel . . . . . . . . . . . . . . .
2.3. Robertsons algoritm . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A. Robertsons algoritm
Exempel . . . . . . . . . . . . . . . . . . . . .
Metod 2 — genom användning av spillflaggan
Exempel . . . . . . . . . . . . . . . . . . . . .
Exempel . . . . . . . . . . . . . . . . . . . . .
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
29
30
30
30
30
31
32
.
.
.
.
35
36
36
37
37
1. Addition och tvåkomplement
Från digitaltekniken har vi behandlat binära tal och vet hur de är uppbyggda. I denna
kurs ska vi tillämpa dessa kunskaper mer praktiskt. För att kunna hänga med i svängarna
har det visat sig att en repetition är nödvändig. Även om du kan mycket om det binära
talsystemet bör du läsa igenom detta så att inget hamnat mellan stolarna.
1.1. Talbaser
Innan vi går in på de egentliga talrepresentationerna måste vi definiera begreppet talbas.
Våra vanliga, hederliga tal har basen 10 och den mest framträdande egenskapen är kanske
att övergången från 9 till 10 innebär att entalssi↵ran här börjar om från noll samtidigt
som talet begåvas med en tiotalssi↵ra. Det är emellertid inget speciellt med basen 10.
Man kan mycket väl tänka sig, exempelvis, basen 5 istället. I det senare fallet byggs alla
tal upp av fem symboler — 0, 1, 2, 3 och 4 — och en uppräkning från noll sker enligt
0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24,. . .
Då ”10” ovan är farligt likt det vi normalt kallar ”tio”, fastän det numeriska värdet inte
alls motsvarar detta, är det vanligt att ange talbasen i petitstil vid sidan av talet, à la
”105 ”. Våra vanliga decimaltal anges på samma sätt med exempelvis ”1710 ”. Lägg märke
till att basen alltid anges i decimal form!1
Det är lätt att hitta symboler för alla tal upp till 9, om vi skulle behöva. Vi tar bara
våra gamla bekanta 0,. . . , 9. Så för talbaser mindre än 10 uppstår inga problem, vi har
redan en uppsättning lämpliga symboler. Men vad händer när vi ska använda en talbas
större än 10? Exempelvis talbasen 16? Symbolerna 0 till 9 återanvänder vi som vanligt,
och när dom tagit slut fortsätter vi med alfabetets bokstäver, A, B, C, D, E och F, och
har på så sätt erhållit 16 symboler. Att räkna med denna talbas kommer bli vardagsmat
under kursen och det är väl redan nu ingen större överraskning att man räknar upp talen
så här:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C,. . .
1
Varför då? Försök själv att ange ”105 ” helt i basen 5, dvs med basen 510 . . .
5
1. Addition och tvåkomplement
Att kunna hantera och översätta mellan olika talbaser är viktigt och några metoder
för detta kommer att presenteras snart. Om detta och andra operationer verkar svårt
kan det kanske vara lämpligt att betrakta hur motsvarande operationer utförs under
talbasen 10. Alla operationer har naturligtvis sin motsvarighet i den decimala talbasen
och de avmystifieras ofta om övergång till decimaltal görs.
Innan vi lämnar dessa preliminärer skall bara nämnas den mest använda talbasen i
digitala sammanhang — basen 2. Vi behöver här två symboler och väljer naturligt dessa
som 0 och 1. Mycket förvirring skulle kunna undanvaras om de en gång hade valts till 0
och X eller något annat som inte förekommer i basen 10, men vi anpassar oss till bruket
i branschen och använder 0 och 1.
Med bara två symboler sker uppräkning från 0 av teckenlösa tal som
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011,. . .
För att inte blanda ihop ”1000” ovan med det decimala ”tusen”, är det viktigt att skriva
talbasen så fort sammanhanget kan vara osäkert för läsaren, dvs talet bör anges som
10002 . Märk att detta är en tjänst åt läsaren. Som vanligt gör man som man vill i egna
anteckningar, men resultat och liknande bör förses med gällande talbas.
10002 uttalas dessutom aldrig ”tusen” utan ”ett-noll-noll-noll”. Tabellen nedan visar förhållandet mellan baserna 10 (decimal bas), 5 och 2.
Bas 10
0
1
2
3
4
5
6
7
8
9
10
11
:
bas 5
0
1
2
3
4
10
11
12
13
14
20
21
:
bas 2
0
1
10
11
100
101
110
111
1000
1001
1010
1011
:
1.2. Addition
Vi har ju ovan redan lärt oss addera — i varje fall med ’ett’ — vid uppräkningen av talen
från noll och uppåt. Vi ska emellertid behandla addition lite för att kunna gå vidare och
lära oss hantera negativa tal och andra räknesätt.
6
1.2. Addition
Addition är enkelt, det finns egentligen bara fyra summor att hålla reda på (talbasen är
förstås 2):
Det enda märkvärdiga med addition är här den fjärde summan, där resultet blir två
si↵ror. Resultatet kan delas upp i en-talsdelen (här 0) och två-talsdelen (här 1).2 Tvåtalsdelen kallas som vanligt för minnessi↵ra eller, vanligare i datorsammanhang, carry
som är det engelska uttrycket.
Addition av flersi↵riga tal utförs som man förväntar sig, om bara ordlängden är given:
Exempel
Addera de båda binära talen 01011 och 10111! Antag ordlängden 510 .
Additionen sker bitvis med början i den minst signifikanta biten. Det viktiga är här att
komma ihåg att 1+1+0=10 och 1+1+1=11 som alltså genererar en carry till nästa bit. Vi
ser också att denna addition ger ett resultat om sex bitar medan termerna bara var fem
si↵ror långa. Om ordlängden är fem bitar kallas den extra, sjätte, biten för carry. Om
ordlängden däremot är, exempelvis åtta, har ingen carry generats i detta fall:
Exempel
Addera de båda binära talen 01011 och 10111! Antag ordlängden 810 .
2
Jämför med additionen 9 + 1 = 10, här får vi en en-talssi↵ra och en tio-talssi↵ra.
7
1. Addition och tvåkomplement
Begreppet ordlängd är viktigt att förstå. Ordlängden anger det antal bitar som används
i beräkningen, med undantag för eventuell genererad minnessi↵ra. Antagligen låter detta
begrepp lite egendomligt, men det klarnar då vi ser att registren i en mikroprocessor har
en konstant längd — som just är lika med ordlängden.
1.3. Talrepresentationer
Det finns två sorters tal i datorsammanhang fixtal och flyttal :
• Ett fixtal är av typen . . . , 2, 1, 0, 1, 2, . . . d v s ett positivt eller negativt tal.
Fixtal behöver däremot inte enbart vara heltal. Det går utmärkt att införa en
decimalpunkt i talet, men då har denna decimalpunkt ett bestämt läge. Precis
som kassaapparater som räknar i ören och har en fast decimaldel som omfattar de
två minst signifikanta si↵rorna.
När vi räknar med fixtal behöver vi aldrig bry oss om decimalpunkten. Den finns
där på ett fast läge och påverkar inte uträkningarna.
• Flyttalen skiljer sig mot fixtalen genom att de kan innehålla en decimalpunkt var
som helst i talet. Praktiskt görs detta genom att talet delas upp en mantissa och
en exponent. Talets värde erhålls sedan ur mantissa · 2exponent . Ofta normaliseras
mantissan, vilket innebär att den görs så stor den kan utan att bli störe än ett.
Med decimala tal kan exempelvis talet 42 anges som 42 · 100 = 4.2 · 101 = 0.42 · 102 .
Mantissan är här 0.42 och exponenten 2. Talet är dessutom normaliserat eftersom
vi inte kan multiplicera mantissan med 10 utan att den blir större än 1. Talen
42 · 100 , 4.2 · 101 och 0.0042 · 104 är däremot inte normaliserade.
Addition av flyttal går till på samma sätt som addition av fixtal. På samma sätt som vi ställer upp de tal som skall adderas så att talens minsta
signifikanta bitar står under varann o s v måste man göra för flyttal. För
att kunna addera två flyttal måste alltså mantissornas respektive bitar
med samma vikt stå under varann. För att åstadkomma detta måste ofta
talen avvnormaliseras så att detta är fallet.
Exempel
Addera de båda flyttalen 63 och 398!
Inget av talen är normaliserade (de är inte ens skrivna på mantissaexponentform) så vi gör det först:
63 = 63 · 100 = 6.3 · 101 = 0.63 · 102 och
8
1.4. Basen 210
398 = 198 · 100 = 39.8 · 101 = 3.98 · 102 = 0.398 · 103
Nu är talen normaliserade och den egentliga additionen kan inledas. Först
gäller det att få si↵ror med samma vikt i samma position eller, vilket
är samma sak, se till att talen har samma exponent. Ett av talen måste
alltså avnormaliseras. Här väljer vi att avnormalisera det mindre talet,
dvs
0.63 · 102 = 0.063 · 103 .
När nu talen har samma exponent kan vi addera mantissorna:
0.063 + 0.398 = 0.460
Vi ser att 0.460 inte kan multipliceras med 10 utan att bli större än ett
varför mantissan är normaliserad redan nu, d v s exponenterna behöver
inte röras och talet kan slutligen skrivas:
0.460 · 103 som alltså är summan av 63 och 398.
Ibland kan additionen av mantissorna ge ett tal som är större än ett. I
sådana fall måste slutresultatet normaliseras, genom att mantissan divideras med 10 och exponenten ökas med ett.
Beräkningar med flyttal ingår inte i kursen men kännedom om dess princip enligt ovan gör det.
1.4. Basen 210
I talbasen 2 representeras talen av dess binära representant som enbart kan utgöras av
talbasens två symboler 0 respektive 1.
Exempel
Översätt det binära talet 10011101 till sitt decimala värde:
9
1. Addition och tvåkomplement
Den enskilda binära si↵ran kallas en bit (av engelskans binary digit). En grupp av fyra
sådana si↵ror kallas en nibble (ev nybble) medan en åtta-grupp kallas för oktett eller
numera vanligare byte.
Det är viktigt att kunna översätta mellan olika talbaser. Speciellt baserna 2, 10 och 16
är vanliga. Förr användes även den oktala talbasen 8 men den är numera sällsynt.
1.5. Höger- och vänsterskift
Man ser snart att man kan multiplicera ett tal med 2 genom att skifta det binära talet
ett steg åt vänster3
P
P
P
Att detta fungerar kan man se av likheten xi ·2n i ·2 = xi ·2n i ·21 = xi ·2(n+1) i .
På motsvarande sätt kan naturligtvis en divison med 2 utföras genom högerskiftning. För
talet ovan är det trivialt att genomföra denna operation, och svaret blir rätt. Om talets
minst signifikanta bit är 1 kommer divisionen resultera i en precisionsförlust eftersom
denna bit kommer att skiftas ut ur talet. En påföljande multiplikation med 2 kommer
inte att resultera i det ursprungliga talet!
Exempel:
1.6. Omvandling från binär till decimal form och tvärtom
Med kännedom om positionsvikterna hos ett binärt tal är det lätt att översätta ett
sådant tal till dess decimala motsvarighet. Omvändningen är dock inte helt lika enkel.
Här skall två metoder presenteras, dels en med hjälptabell över tvåpotenser och dels en
genom upprepad division med 2 och inspektion av divisionens rest.
3
Jämför med hur vi i det decimala talsystemet lätt kan multiplicera ett tal med 10 genom att skifta
talet åt vänster och lägga till en nolla.
10
1.6. Omvandling från binär till decimal form och tvärtom
Exempel
Översätt 9810 till dess binära motsvarighet!
Metod 1. Med hjälptabell
Leta reda på, och subtrahera med, närmast mindre tvåpotens. Om subtraktionen gav ett
negativt resultat, notera en nolla, återställ resultatet och börja om. Om subtraktionen
gav ett positivt resultat noteras en etta och resultatet använs i nästa omgång. Alltså:
D v s 9810 = 11000102 . Man läser högra kolumnen uppifrån. Och man ser då också varför
metoden fungerar, den skiljer precis ut de jämna tvåpotenser som bygger upp talet. Just
här använde vi ingen tabell men det är lätt att upprätta en tabell över tvåpotenser för
att underlätta översättningen.
Metod 2. Genom upprepad division med 2
Samma tal som ovan ger följande beräkningar. Lägg märke till om rest uppstår vid
divisionen.
. . . som ger samma svar som förra metoden, 11000102 . Men man måste läsa nerifrån och
upp i det senare fallet.
11
1. Addition och tvåkomplement
1.7. Hexadecimal representation
Förutom det rent binära talsystemet förekommer även det hexadecimala talsystemet,
med basen 1610 ofta i fortsättningen. Det är i allmänhet inga svårigheter att omvandla
ett binärt tal till dess hexadecimala motsvarighet och tvärtom. Med följande hjälptabell
är det särskilt enkelt.
Decimaltal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Binärtal
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Hexadecimaltal
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1.7.1. Omvandling binär till hexadecimal form
Exempel
Översätt talet 11101011112 till basen 1610 !
Vi använder tabellen ovan. Översätt varje fyr-grupp till sin hexadecimala motsvarighet
och saken är klar:
Det kan faktiskt vara idé att lära sig tabellen utantill, åtminstone tills kursen är avslutad.
12
1.8. Negativa binära tal
1.7.2. Olika skrivsätt
Förutom att skriva ett litet index som anger talbasen signaleras i allmänhet hexadecimala
tal genom att det inleds med ett $-tecken, men även andra skrivsätt förekommer. Således
är detta sant:
$62 = 0x62 = H 0 62 = 6216 .
1.7.3. Omvandling hexadecimal till decimal form
Översättningen mellan hexadecimala tal och decimaltal görs med kunskap om talpositionen:
Exempel
Översätt det hexadecimala talet $3AF till decimaltal!
1.8. Negativa binära tal
För teckenlösa binära tal har vi sett att talvärdet kan erhållas genom addition av tvåpotenser. Närmare bestämt tvåpotenserna ..., 23 , 22 , 21 , 20 dvs talen ..., 8, 4, 2, 1. Ett fyrabitars positivt tal, X , som består av bitarna x3 , x2 , x1 , x0 får alltså det decimala värdet:
Vi har även behov av att kunna representera negativa tal. Det finns flera möjliga representationer för dessa. Vi fastnar för en som har trevliga egenskaper och dessutom enkelt
kan implementeras i hårdvara, 2-komplement.
13
1. Addition och tvåkomplement
1.9. 2-komplement
Ett tal, X = {x3 , x2 , x1 , x0 }, kan i 2-komplement skrivas:
Vi ser att talets bitar får positionsvikterna 4, 2, och 1 som vanligt men att mest signifikant
bit har störst och negativ vikt. Bitarna {x2 , x1 , x0 } bygger upp ett positivt tal men
eftersom x3 :s vikt är störst och negativ kommer denna att byta tecken på hela talet om
den är ett-ställd. Mest signifikant bit kallas därför för teckenbit. För att sammanfatta:
Ett tvåkomplementstal med mest signifikant bit ett-ställd är alltså
alltid ett negativt tal. Ett tvåkomplementstal med mest signifikant
bit noll -ställd är alltså alltid ett positivt tal.
Exempel
Översätt det binära talet 1011 till ett decimaltal under förutsättning att vi
vet att det är ett tvåkomplementstal!
För att tydlighets skull gör vi detta i två steg:
• Först bygger vi upp ett positivt tal med bitarna {x2 , x1 , x0 } enligt formeln ovan:
• Sedan applicerar vi teckenbiten, x3 :
Tydligen betyder 10112 = 510 . Och det verkar rimligt eftersom teckenbiten är
satt och talet således är negativt.
14
1.9. 2-komplement
En tabell över decimaltal och trebitars tvåkomplementstal kan konstrueras på samma
sätt som i exemplet:
Decimaltal
0
1
2
3
4
3
2
1
Tvåkomplementtal
000
001
010
011
100
101
110
111
Vi ser att tvåkomplementsrepresentationen kan representera både positiva och
negativa tal. De negativa binärtalen utmärks av att teckenbiten är ett-ställd. De positiva kännetecknas av att teckenbiten är nollställd. Detta gäller generellt, oavsett vilken
ordbredd som används.
Fördelen med tvåkomplementsrepresentationen är att vi kan genomföra additioner och
subtraktioner precis som förut. D v s det behövs ingen speciell additionsmetod bara för
att talen är tvåkomplementerade.
En direkt följd av detta är att det inte finns något som överhuvudtaget skiljer tvåkomplementstal från teckenlösa tal. Man kan inte se på dem om de är det ena eller det andra.
Det är upp till betraktaren att avgöra om ett tal skall tolkas som ett tvåkomplementstal
eller inte.
Exempel
Visa att addition med tvåkomplementstal ”fungerar” och ger rätt resultat!
Vi kan göra det med tabellen ovan som hjälp.
15
1. Addition och tvåkomplement
I och med att vi kan addera vilka tal som helst kan vi också subtrahera dom, ty subtraktion kan ses som addition med omvänt tecken på ena termen. En kunskap vi ju faktiskt
redan använde i exemplet ovan.
Tvåkomplementsrepresentationen av ett binärt tal är lätt att beräkna: Invertera alla
bitar och addera 1, dvs
Om man lever i en tvåkomplementsvärld sker alltså teckenbyte av ett tal genom att tvåkomplementera det. Teckenbytet gäller förstås både övergång från positiva till negativa
tal och tvärtom.
Två anmärkningar
• Ett vanligt missförstånd är att tvåkomplementstal med nödvändighet är negativa.
Det är inte sant. De kan vara negativa men det hänger på teckenbiten om de är
det. Ett positivt tal kan tvåkomplementeras till ett negativt och ett negativt tal
kan tvåkomplementeras till ett positivt.
• Ett tvåkomplementstal byter inte tecken bara genom att ändra teckenbiten. Det
byter förstås tecken men talet blir samtidigt något annat. Man måste tvåkomplementera det för att beloppet ska vara detsamma.
Exempel
1) Vad blir –7 uttryckt som ett binärt (tvåkomplements) tal?
2) Vad blir 11012 i decimal form?
Talet är negativt då teckenbiten, längst till vänster i talet, är ett-ställd. För att ta reda
på vilket negativt tal det är tar vi först fram vilket positivt det handlar om. Vi vet ju
sedan att det skall förses med ett negativt tecken.
16
1.10. Aritmetiska operationer: addition, subtraktion, skift
Talets belopp är således 3 och med rätt tecken är svaret
3.
1.10. Aritmetiska operationer: addition, subtraktion, skift
Med några enkla prov kan vi konstatera att följande gäller även för tvåkomplementrepresentationen:
1. Addition fungerar som vi förväntar oss.
2. Subtraktion genomförs som addition med negativt tal, d v s a
b = a + ( b).
3. Vänsterskift av alla bitar ett steg innebär multiplikation med två.
4. Högerskift av alla bitar är nästan division med två:
+410
210
2
= 0100
210 = 00102 = 210 , som är korrekt, men
410
210
=
11002
210
= 01102 = +6, som är fel!
Problemet löser vi här genom att införa ett speciellt högerskift som bara ska användas vid tvåkomplementkodade tal4 , det aritmetiska (höger)skiftet som bevarar
teckenbitens värde:
410
210
=
11002
210
= 11102 =
2, ok.
Det aritmetiska högerskiftet kan alltså5 ritas som
Man ser att teckenbiten längst till vänster bevaras (kopieras till sig själv) medan
biten längst till höger går förlorad.
4
5
Och strängt taget bara nödvändigt vid högerskiftning av negativa tvåkomplementkodade tal.
Istället för att kasta bort den minst signifikanta biten lagras den ofta i carryflaggan. Det viktiga är
här vad som händer vid den mest signifikanta biten — den måste bevaras, den innehåller ju talets
tecken.
17
1. Addition och tvåkomplement
1.11. Ett hjälpmedel: cirkulärgrafen
Addition och subtraktion kan göras mer åskådliga med cirkulärgrafen. Cirkulärgrafen
är i princip en tallinje med den skillnaden att den tar hänsyn till att vi rör oss med en
begränsad ordlängd och att vi dessutom föredrar tvåkomplementrepresentation framför
allt:
000
0
111
−1
001
+1
110 −2
−3
101
+2 010
+3
−4
100
011
Som på en tallinje kan addition genomföras genom att gå åt höger, vilket blir medurs
i här. Och omvänt med subtraktion. Det man speciellt ska lägga märke till är vad som
händer vi addition av tal med lika tecken.
Exempel
Addera 310 och 210
I basen 2 börjar vi vid 011 och stegar sedan fram medurs genom 100 till 101 och summan
är tydligen 101 = 310 !
Det var ju egendomligt att en addition av positiva tal kan ge ett negativt tal som resultat,
men det är helt konsekvent med vår cirkulärgraf. Orsaken kan naturligtvis härledas till
vår begränsade ordlängd. Med en längre ordlängd skulle ovanstående addition fungera
— ända tills vi adderar oss över gränsen mellan positiva och negativa tal.
1.11.1. Spill
Fenomenet ovan kallas spill (eng overflow ) och ställer till problem för oss då vi efter varje
addition måste kontrollera om spill uppstått. Om spill föreligger är resultatet alltså felaktigt. Lägg märke till att det inte är något fel i själva additionen, bitarna har adderats
18
1.12. Hårdvara
på rätt sätt, det är vår tvåkomplementstolkning som ställer till det. Om vi istället för
tvåkomplementstal enbart tänker oss positiva tal hela cirkeln runt så stämmer additionen.
Spill uppkommer om tal med lika tecken ger en summa med
annat tecken.
Spill är bara intressant vid 2-komplementstal, annars är ju ”annat tecken” omöjligt! En
följd av detta är att om addition av teckenlösa tal ger spill kan man bortse från detta.
På ungefär samma sätt visualiserar cirkulärgrafen när en minnessi↵ra, carry skapas vid
övergång mellan 111..11 och 000..00. Lägg märke till att närvaron av en carry inte
innebär något problem om talen är tvåkomplementkodade, i detta fall är övergången
från negativa till positiva tal helt legitim. Carry uppstår även vid övergång från andra
hållet dvs subtraktion, men motsvarar då en lånesi↵ra och kallas borrow.
Carry uppkommer vid övergång mellan 111..11 och 000..00. Borrow vid
omvänd övergång.
1.12. Hårdvara
Med addition avklarad på papper ska vi se hur den även kan klaras av i hårdvara. Från
digitaltekniken är heladderaren bekant och det är heladderaren som är det fundamentala byggblocket i fortsättningen. Inte bara för addition och subtraktion utan även för
multiplikation och division.
x
cut
y
FA
cin
s
Fulladderaren6 adderar x, y och en inkommande carry cin och genererar en summa s
och en utgående carry, cut . Med en dylik fulladderare kan man konstruera en godtyckligt
bred adderare genom att lägga flera FA bredvid varann och knyta ihop carry-kedjorna.
För att lättare hantera de kommande uttrycken inför vi nu en definition av de vektorer
av 1:or och 0:or som utgör de enskilda talen:
6
Fulladderaren kallas även heladderare. Eftersom förkortningen för heladderare, HA, även kan misstolkas
för halvadderare undviker jag det namnet.
19
1. Addition och tvåkomplement
X = {x3 x2 x1 x0 }
Y = {y3 y2 y1 y0 }
S = {s3 s2 s1 s0 }
Med dessa beteckningar kan en fyra-bitars fulladderare tillverkas enligt nedan:
Vi får en utgående carry och en inkommande carry från höger som alltid är noll. Om
den var 1 skulle vi utföra x + y + 1 och det vill vi ju inte.
Men spill då? Adderaren är tämligen värdelös om den inte kan säga till om den räknat
fel. . . Vi har tidigare sett när spill uppstår i cirkulärgrafen, men när är det egentligen?
Om vi specialstuderar fulladderaren längs till vänster — det är ju i den änden teckenbiten
sitter — kan vi skapa en liten tabell:
Om vi nu kommer ihåg när spill kan inträ↵a kan vi tillfoga en kolumn för dessa fall också.
Resonemanget är vår kunskap om att addition av två positiva tal aldrig kan ge negativt
resultat. Om resultatet byter tecken har spill inträ↵at. Kom ihåg att vi betraktar talen
som tvåkomplementkodade, dvs de har en teckenbit.
20
1.12. Hårdvara
Som tur är inträ↵ar spill bara i två fall. Kan vi nu bara konstruera logik för att identifiera
vilka insignalkombinationer som ger detta kan vi tillverka oss en spillindikator. Nu kan
man naturligtvis sätta sig att tillverka Karnaugh-diagram för att reda ut logiken, men
lite inspektion av tabellen räcker faktiskt. Det är inte ofta naturen är på vår sida, men
i just det här fallet blir logiken mycket enkel:
Det är en enkel sak att komplettera vår adderare med denna indikator och har nu
plötsligt en fungerande adderare för tvåkomplementstal, den kan addera positiva såväl
som negativa tal.
Men vi behöver kunna utföra subtraktion också. Visst vore det bra om samma hårdvara
kunde utnyttjas? Vi har ovan sett att addition och subtraktion hänger intimt ihop enligt
X Y = X + Y, där Y = Y + 1. Alltså, sammantaget,
Allt i högerledet — additioner — kan vi redan utföra. Men vi behöver också kunna invertera ena talet för subtraktionen. Vid addition ska talet förstås inte inverteras. Således
måste vi ordna till en styrbar inverterare, dvs styrbar så att den kan fås att invertera
eller inte beroende på en yttre styrsignal.
Det visar sig att det är precis vad en xor-grind gör:
Så nu kan vi införa en styrsignal add/sub som automatiskt genomför till inverteringen
av Y. Om signalen är låg adderas talen och om den är hög inverteras Y.
Återstår avslutningsvis att även addera 1 vid subtraktion. Det kan lösas genom att låta
en 1:a anslutas till cin vid minst signifikant bit. Och denna 1:a tar vi naturligtvis från
add/sub som ju är hög vid subtraktion och låg annars.
Exempel
Avgör om nedanstående beräkningar ger spill och/eller carry! Vilka har gett
korrekt resultat?
+
=
00000110
00001000
00001110
C=
(+6)
(+8)
(+14)
V=
+
=
01111111
00000001
10000000
C=
(+127)
(+1)
(–128)
V=
+
=
00000100
11111110
00000010
C=
(+4)
(–2)
(+2)
V=
21
1. Addition och tvåkomplement
+
=
22
00000010
11111100
11111110
C=
(+2)
(–4)
(–2)
V=
+
=
11111110
11111100
11111010
C=
(–2)
(–4)
(–6)
V=
+
=
10000001
11000010
01000011
C=
(–127)
(–62)
(+67)
V=
2. Multiplikation
Vi har fortfarande ingen multiplikator. Man kan helt säkert syntetisera en multiplikation med hjälp av upprepade additioner, men det är en hejdlöst långsam metod. Kan
multiplikationen genomföras direkt i hårdvara är det definitivt en tidsvinst.
I vissa fall kan det vara enkelt att beräkna resultaten i förväg och lägga dem som en
tabell i ett programmerbart minne. Då behöver man inte utföra några beräkningar när
man vill ha resultatet vilket ger snabb åtkomst. Minnet adresseras med operanderna
som ingångsvärden, vilket kan bli ohanterligt om dessa är långa. Men vid korta tabeller
är det ofta smidigt. Ett typexempel på en situation där det kan löna sig att beräkna
i förväg är de transcendenta funktionerna sin x, cos x etc1 . I fortsättningen ska dock vi
behandla det mer generella fallet.
Först måste vi dock klura ut en lämplig algoritm — oavsett om vi ska multiplicera i
hårdvara eller mjukvara. Problemet är alltså:
X = {x3 x2 x1 x0 } = 8 · x3 + 4 · x2 + 2 · x1 + x0
Y = {y3 y2 y1 y0 } = 8 · x3 + 4 · x2 + 2 · x1 + x0
Z = {z7 z6 z5 z4 z3 z2 z1 z0 } = 128 · x7 + . . . + x0
X,Y
Z
0
0
Hur multiplicerar man egentligen? De med gott minne kommer ihåg grundskolan då man
gjorde ungefär så här, där vi utgår från att vi har enbart med heltal att göra:
1
I dessa fall räcker det dessutom att tillverka en tabell över en halv kvadrant med sinusfunktionen och
sedan kan man med speglingar och trigonometriska identiteter relativt lätt beräkna övriga.
23
2. Multiplikation
Såg ni vad som hände? Den ena faktorns minst signifikanta bit angav om summering
skulle ske eller inte. Där den var noll hände inget annat än att vi skiftade resultatet ett
snäpp åt vänster. Ovanstående beräkning kan utföras i mindre steg om vi adderar så
tidigt vi kan:
Det är intressant att notera hur vissa tal aldrig kommer att adderas, de bara faller ner
till slutresultatet. Redan efter första additionen vet vi hur resultatet kommer att sluta!
För tydlighetens skull formaliserar vi detta med symboler i stället för binära tal2 . Med
beteckningar enligt problemdefinitionen har vi:
2
De binära talen 1 och 0 är ju i och för sig symboler för nåt också...
24
Vi kan redan nu få en uppfattning om vilken hårdvara som behövs. Tydligen behövs
AND-grindar och 3 nivåer med fulladderare i huvudsak. Med våra fyra bitar kan resultatet se ut så här:
x4
0
y1
y2
y3
y4
&
&
&
&
x3
y1
y2
y3
y4
&
&
&
&
FA
FA
FA
FA
c_in=0
x2
y1
y2
y3
y4
&
&
&
&
FA
FA
FA
FA
c_in=0
x1
z1
y1
y2
y3
y4
&
&
&
&
FA
FA
FA
FA
z2
z3
z4
z5
c_in=0
z6
z7
z8
Totalt behövs här 12 heladderare och 16 AND-grindar. Heltalen rinner igenom konstruktionen med början vid toppen och när signalerna nått nedre delen av är resultatet klart.
Det är en mycket snabb multiplikator: en heladderare fördröjer signalen kanske 10 ns och
en AND-grind tar ännu kortare tid3 . Med tre nivår heladderare kan vi alltså multiplicera
med en hastighet av cirka 1/(10 + 10 + 10 + ca10) nanosekunder ⇡ 25 miljoner multiplikationer per sekund! En högst respektabel hastighet och antagligen mycket snabbare än
vi, dvs processorn, hinner förse den med uppgifter.
Men det gick åt en del hårdvara för att komma hit. Hur mycket hårdvara skulle det gå
åt om man utökade multiplikatorn till 8 eller kanske 16 bitar? Vi kan se att ”arean” av
ritningen ökar ungefär med kvadraten på antalet bitar i talen. En 16-bitars multiplikator
skulle med detta resonemang bli fyra gånger högre och fyra gånger bredare, dvs 16 gånger
3
Tiderna är tagna från motsvarande TTL-logik. Grindfördröjningen i modernt kisel är bråkdelar av
nanosekunder.
25
2. Multiplikation
större, fastän bitbredden bara ökade fyra gånger! En sådan tingest vill vi antagligen
inte ens försöka tillverka — i varje fall inte med lösa integrerade kretsar — den blir
omfattande.
Slutsats är alltså: Det är snabbt, men rätt komplicerat och dyrt. Däremot är det en fullt
möjlig väg att gå, metoden fungerar.
2.1. Multiplikation — snitsigare metod
Varför blev det såhär? Tydligen är hårdvaru-”skiftningen” orsaken till den kvadratiska
ökningen. Kan man eliminera det skiftet är mycket av problemen lösta, det skulle bli en
lineär ökning av hårdvaran i stället för en kvadratisk. I stället för att skifta vänster och
addera borde man kunna skifta resultatet åt höger och på så sätt återanvända hårdvaran?
I och med att vi vill multiplicera två fyrabitars tal kan vi vara säkra på att svaret högst
kan ha åtta bitar så vi ansätter ett 8bits startvärde. Och istället för att skifta längre och
längre åt vänster skiftar vi varje partialprodukt åt höger:
Vi döper partialprodukterna p0 , p1 , p2 , p3 och p4 där p4 det önskade svaret.
Matematisk beskrivning av metoden
Tydligen fungerar denna metod också. Vi har kommit fram till en multiplikator med
modesta krav på hårdvaran och som dessutom kan utökas till att hantera fler bitar utan
att hårdvaran och komplexiteten växer oss ur händerna. Metoden verkar så lovande att
vi måste beskriva den matematiskt.
Våra förutsättningar är:
26
2.1. Multiplikation — snitsigare metod
• heltalet X =< x3 x2 x1 x0 >= 8 · x3 + 4 · x2 + 2 · x1 + x0 och
• heltalet Y=< y3 y2 y1 y0 >= 8 · y3 + 4 · y2 + 2 · y1 + y0 , samt
• p0 = 0, som för tydlighetens skull skrivs 0000 00004
Genom inspektion av den tidigare uträkningen kan vi formulera de fem partialprodukterna som
Alltså slutligen:
pi+1 = (pi + Y · xi · 24 )2
för i = 0, 1, 2, 3.
1
där P4 är den önskade produkten. Det här kan man göra hårdvara för:
4
Åtta bitars partialresultat — och vi vet varför.
27
2. Multiplikation
x4,x3,x2,x1
y1
y2
y3
y4
&
&
&
&
FA
FA
FA
FA
D
D
D
D
c_in=0
D
D
D
D
Reset, nollställning
Genom att ha ett partialproduktregister vet vi automatiskt var svaret kommer att hamna. Vi kommer att behöva nollställa det innan varje multiplikation, men det är enkelt.
Ett krux kanske är att ena faktorn måste matas in bit för bit i den övre delen av schemat
(hur gör vi det?). För att utföra beräkningen måste systemet ovan klockas fyra gånger.
Ett sätt att mata fram X är att från början lägga X i ett register och sedan skifta detta
register bit för bit. . . Men
• vi har ju redan ett register, och
• vi laddar det med nollor — nollor som skiftas ut och aldrig blir del av resultatet.
Så varför inte kombinera dessa faktum? Det vill säga: ladda in X i lägre halvan av
partialregistret (i rätt ordning) och anslut den utskiftade biten till AND-grindarna högst
upp. Det är klart vi gör så. Vi återanvänder isåfall dessutom hårdvaran på ett smidigt
sätt.
2.2. Men tvåkomplement då?
Nu har vi i varje fall, efter en stunds resonemang och prov, en algoritm som verkar
fungera. Åtminstone för positiva heltal. Hur var det nu med tvåkomplement? Det vill
säga hur ska vi kunna multiplicera tal med tecken?
Det går naturligtvis utmärkt att göra båda talen positiva och sedan multiplicera ihop
dem. Följt av att möjligen ändra tecken på resultatet. Men vi letar i första hand efter
att på något sätt använda multiplikationshårdvaran ovan och det är förstås bra om vi
inte behöver manipulera talen innan. Och det visar sig att vi får hjälp av att ha beskrivit
den tidigare algoritmen matematiskt.
Vi ser att
28
2.2. Men tvåkomplement då?
X =< x3 x2 x1 x0 >=
8 · x3 + 4 · x2 + 2 · x1 + x0
vilket betyder att om vi adderar Y · x3 vid sista additionen i algoritmen får talet rätt
tecken, eftersom x3 är teckenbiten i tvåkomplementttal. Själva multiplikationsalgoritmen
är i stort sett oförändrad.
2.2.1. Utökat talområde
Allt är dock inte frid och fröjd än. Vi måste också hantera att addition med tvåkomplementstal kan ge spill och det kan vi förstås inte tillåta. Om vi studerar den tidigare
algoritmen ser vi att spillet5 kan uppstå vid additionen med pi i varje steg. Vi kan införa
logik som letar efter detta och kompenserar på något sätt, men faktum är att problemet
är hävbart redan nu: Vi högerskiftar alltid efter en addition6 ! Med andra ord kommer
ett eventuellt spill alltid automatiskt infogas i det tillåtna talområdet. Men det krävs
att vi sparar den carry som skapades av additionen. Det kan vi göra om vi har ett utökat
talområde.
Vi tittar först på vad utökat talområde egentligen är med ett exempel.
Exempel
Utökat talområde på positiva tvåkomplementstal
. . . och på negativa tal
2.2.2. Spillkompensering av (a + b)/2
Det finns två metoder att korrigera resultatet om spill vid operationen (a+b)/2 inträ↵at.
Den metod som först beskrivs är metoden med utökat talområde och den sista är metoden utan utökat talområde. I båda beskrivningarna nedan antas att talen är fyrabitars
tvåkomplementskodade tal.
5
Vi påminner oss om att spill uppstår då addition av två tal med lika tecken ger en summa med omvänt
tecken.
6
Detta skrivs i algoritmen som multiplikation med 2 1 , dvs ett aritmetiskt högerskift, eftersom vi
handskas med tvåkomplementstal.
29
2. Multiplikation
Metod 1 — Med utökat talområde
Med utökat talområde ser man till att, i varje fall just vid additionen, ha tillgång till
en ytterligare bit till vänster om teckenbiten. Det är denna bit som måste sparas för att
man ska kunna genomföra det aritmetiska högerskiftet på ett korrekt sätt.
Om vi vid additionen har tillgång till ytterligare en bit, en ”mestare signifikant bit”,
kommer additionen inte att kunna ge spill — i detta nya utökade talområde. Och med
tillgång till den biten kan det aritmetiska högerskiftet utföras utan att resultatet blir fel
— teckenbiten kommer att bevaras — och spill kan undvikas
Exempel
Beräkna (3 + 5)/2 och ( 4
6)/2!
Metod 2 — Utan utökat talområde
Om vi inte kan använda metoden med utökat talområde har vi fortfarande en möjlighet
att korrigera (a + b)/2 så att resultatet blir korrekt. Vi har hittills inte använt spillflaggan, V, där V = ci co enligt förra föreläsningen. Om vi ser på spillflaggan att spill
inträ↵at kan vi förstås också kompensera för det. Spillkompensationen är i detta fall
enkel: Om summan av två lika tal bytt tecken måste vi kompensera genom att byta
tillbaka teckenbiten! Observera att det inte handlar om att byta tecken på talet, bara
att ”flippa” teckenbiten.
Exempel
Beräkna (3 + 5)/2 och ( 4
30
6)/2!
2.3. Robertsons algoritm
I en del böcker står det att man nu utför addition med 1 i teckenpositionen. Detta är
i och för sig sant, men eftersom vi nu inte har utökat talområde kan vi strunta i den
genererade carryn och få samma e↵ekt genom att helt enkelt invertera teckenbiten! Vad
hårdvaran anbelangar är den enklare om vi väljer att använda en inverterare än att
använda ytterligare en adderare. Och eftersom det är rätt tecken på (a + b)/2 vi söker,
korrigerar vi efter det aritmetiska skiftet som vanligt.
2.3. Robertsons algoritm
Om vi använder den samlade kunskapen ovan, dvs
• Tvåkomplementstal divideras med två genom aritmetiskt högerskift,
• spill kan kompenseras men någon av metoderna, samt
• en avslutande addition med
Y · x0 sätter tecknet på tvåkomplementstal
kan vi sammanställa detta till Robertsons algoritm.
Vi formaliserar även denna algoritm innan ett exempel kommer:
Med förutsättningen att båda talen X och Y är tvåkomplementkodade:
X = {x3 x2 x1 x0 } =
Y = {y3 y2 y1 y0 } =
8 · x3 + 4 · x2 + 2 · x1 + x0 , där x3 är teckenbit
8 · y3 + 4 · y2 + 2 · y1 + y0 , där y3 är teckenbit
När vi multiplicerar två fyrabitars tal som vardera har en teckenbit kommer resultatet
bara ha en teckenbit z6 , så att
Z = {z6 z5 z4 z3 z2 z1 z0 }
31
2. Multiplikation
och vi kan skriva algoritmen som
Resultatet av multiplikationen är den sist erhållna partialprodukten P4 och beviset kan
göras med insättning som förut.
Exempel
Multiplicera Y = 7 och X =
5 med Robertsons algoritm!
Slutligen kan vi konstatera att vi kan använda den tidigare utvecklade hårdvaran även
för Robertsons algoritm, med undantag för det sista steget i algoritmen, som är en
addition med omvänt tecken. Vi behöver en styrbar subtraherare/adderare som tydligen
ska addera i allmänhet men inte sista gången. Det löser vi enkelt genom att låta sekvensen
”0, 0, 0, 0, 1” styra ett gäng inverterare för ena operanden och, för att få det sista
steget att verkligen addera med omvänt tecken, låta samma sekvens samtidigt gå in på
fulladderarnas minst signifikanta bit enligt figuren nedan:
32
2.3. Robertsons algoritm
y0
y1
y2
y3
&
&
&
&
&
=1
=1
=1
=1
=1
SUB
Reset
0,0,0,1
FA
FA
FA
FA
FA
D
D
D
D
D
D
D
D
0
0
0
0
x0
x1
x2
x3
Vi har nu behandlat den binära aritmetik som kan ingå i en enkel processor och sett i
detalj hur den fungerar. För att vara ännu mer kompletta skulle vi kunnat titta även
på division, men de aritmetiska funktionerna är i allmänhet bara addition och subtraktion — åtminstone i billigare processorer. I dyrare processorer kan även multiplikation
och kanske till och med division förekomma. Division används förhållandevis sällan i
verkligheten, mycket mer sällan än multiplikation,
33
2. Multiplikation
34
A. Robertsons algoritm
Det finns åtskilliga algoritmer för binär multiplikation. På föreläsningarna utvecklades
en algoritm för multiplikation av tvåkomplementkodade tal som hade den fördelen att
mycket av den hårdvara som den aritmetisk-logiska enheten består av enkelt kan återanvändas. Algoritmen framtogs först av Robertson och är namngiven efter honom som
Robertsons algoritm.
Detta extramaterial innehåller genomarbetade exempel på Robertsons algoritm. Men
först en definition:
Definition. Med talen X = x3 x2 x1 x0 och Y = y3 y2 y1 y0 kodade som tvåkomplementstal kan produkten p = x·y beräknas enligt Robertsons algoritm:
p0 = 0
(A.1)
pi+1 = (pi + y · xi · 2 ) · 2
3
1
(A.2)
i = 0, 1, 2
(A.3)
p = p3
(A.4)
y · x3 · 23
Vid rad (0.2) i algoritmen adderas två tvåkomplementskodade tal och följaktligen kan
talområdet överskridas — spill inträ↵ar. Vi vet sedan tidigare att spill uppstår då addition av tvåkomplementkodade tal med lika tecken resulterar i en summa med annat
tecken.1
För att algoritmen skall kunna implementeras måste vi se till att ett eventuellt spill tas
om hand innan nästa steg tas. Det finns två metoder för detta och båda baserar sig på
det faktum att algoritmen omedelbart dividerar med två — ”. . . ) · 2 1 ” ovan — efter den
potentiellt ”farliga” additionen. Vi vill således spillkompensera uttryck av typen (a+b)/2
och noterar samtidigt att division med två motsvarar aritmetiskt högerskift för tal i den
använda representationen. De två metoderna är då:
• Spillkompensering genom utökat talområde, och
1
• Spillkompensering genom användning av spillflaggan.
Detta enkla faktum är tydligen lätt att bortse ifrån. Det är dock grunden för hanteringen av multiplikationsalgoritmen i det följande. Så se till att förstå vad detta innebär!
35
A. Robertsons algoritm
Metod 1 — Genom utökat talområde
Med utökat talområde ser vi till att, i varje fall just vid additionen, ha tillgång till en
ytterligare bit till vänster om teckenbiten. Det är denna bit som måste sparas för att
man ska kunna genomföra det efterföljande aritmetiska högerskiftet på ett korrekt sätt.
Om vi vid additionen har tillgång till ytterligare en bit, en ”mestare signifikant bit”,
kommer additionen inte att kunna ge spill — i detta nya utökade talområde. Och med
tillgång till den biten kan det aritmetiska högerskiftet utföras utan att resultatet blir fel
— teckenbiten kommer att bevaras — och spill kan undvikas.
Exempel
Beräkna (3 + 5)/2 respektive ( 4 6)/2. Det utökade talområdet utförs som
en extra bitposition till vänster om talet. Aritmetiskt skift markeras med ”!”
och den utökade teckenpositionen med ”†”. Negativa tal måste teckenutvidgas innan additionen utförs. Den understrukna biten kan kastas direkt och
behöver inte tas fram.
+
!
†
0 0011
0 0101
0 1000
0100
(+3)
(+5)
( 8)
(+4)
+
!
†
1 1100
1 1010
11 0110
1011
( 4)
( 6)
??
( 5)
Metod 2 — genom användning av spillflaggan
Om vi inte kan använda metoden med utökat talområde har vi fortfarande en möjlighet
att korrigera (a + b)/2 så att resultatet blir korrekt. Spillflaggan innehåller information
om huruvida talområdet överskridits2 och om vi ser på spillflaggan att spill inträ↵at
kan vi förstås också kompensera för det. Spillkompensationen är i detta fall enkel: Om
summan av två lika tal bytt teckenbit måste vi kompensera genom att byta tillbaka
teckenbiten! Det innebär här att helt enkelt byta värde på teckenbiten, från en etta till
en nolla eller tvärtom. Det innebär inte att byta tecken på hela talet genom att ”invertera
och addera ett”.
2
Vi vet sedan tidigare att spillflaggan, V, formas av uttrycket V = ci co , där ci och co är carry-in
respektive carry-out runt mest signifikant bit, vilket motsvarar teckenbiten i vårt fall.
36
Exempel
Beräkna (3 + 5)/2 respektive ( 4 6)/2. Spillflaggan V :s värde noteras efter
additionen. Aritmetiskt skift markeras som förut med ”!”. Metoden med
utökat teckenområde visas till vänster och till höger används spillflaggeinformationen.
+
V=1
!
spillkorr
0011
0101
1000
1100
0100
(+3)
(+5)
( 8)
( 4)
(+4) OK!
+
V=1
!
spillkorr
1100
1010
0110
0011
1011
( 4)
( 6)
(+6)
(+3)
( 5) OK!
Beväpnad med denna information kan vi nu angripa Robertsons algoritm. Innan vi börjar
ansätter vi för tydlighetens skull rätt antal bitar i den första partialprodukten, p0 . Då vi
i exemplet antagit fyrabitars tal kommer resultatet att högst kunna ha sju bitar, varav
en teckenbit, och p0 ansättes alltså till ”0000000”, med teckenbiten längst till vänster.
Exempel
Mutliplicera de två talen Y = y3 y2 y1 y0 = 6 och X = x3 x2 x1 x0 = 5
med Robertsons algoritm. Då åtminstone ett av talen har negativt tecken
och Robertsons algoritm skall användas förutsätts tvåkomplementrepresentation gälla. Alltså Y = 0110 och X = 0101 + 1 = 1011. Vi behöver även
Y = 0110 + 1 = 1010. Till vänster visas metoden med utökat talområde
och till höger används spillflaggan. Teckenbiten markeras i båda fallen med
”#” och den utökade teckenpositionen med ”†”. Notera att den utökade teckenpositionen vid det aritmetiska skiftet skall användas som mest signifikant
bit!
37
A. Robertsons algoritm
+
!
+
!
+
!
+
† #
0000000
0110
0 0110000
0011000
0110
0 1001000
0100100
0000
0 0100100
0010010
1010
1100010
p0
x0 · Y
p1
x1 · Y
p2
x2 · Y
p3
x3 · Y
p4 = X · Y =
30
+
V =0
!
+
V =1
!
spillkorr
+
V =0
!
+
#
0000000
0110
0110000
0011000
0110
1001000
1100100
0100100
0000
0100100
0010010
1010
1100010
p0
x0 · Y
p1
x1 · Y
p2
x2 · Y
p3
x3 · Y
p4 = X · Y =
30
Ibland kan det bli enklare beräkningar om man låter X och Y byta plats. Slutresultatet
torde ändå bli detsamma.
38