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