原碼:
最高位為符號位,0表示正數,1表示負數。
正數的原碼:等於本身
負數的原碼:等於(1-本身)
例如:X = +0.1011 , 原碼 = 01011 ;
X = - 0.1011 , 原碼 = 11011 ;(小數點可以保留或者省略)
補碼:
最高位為符號位,0表示正數,1表示負數。
正數(X)的補碼:等於本身。
負數(X)的補碼:等於(2+X)=(2-|X|),(各位取反,末尾加一)
例如:X = +0.1011 , 補碼 = 0.1011 ;
X = -0.1011 , 補碼 = 1.0101 ;
正0的補碼 = 負0的補碼 = 0.0000 。
補碼加法運算:[X+Y]的補碼 = [X]的補碼 + [Y]的補碼 。
反碼:
最高位為符號位,0表示正數,1表示負數。
正數(X)的反碼 = 本身
負數(X)的反碼 = 2 - (2的(-n)次冪)+ X , (各位取反)
例如:X = +0.1011 (n = 4), 反碼 = 0.1011 ;
X = -0.1011 (n = 4) , 反碼 = 1.0100 ;
正0的反碼 = 0.0000 , 負0的反碼 = 1.1111 ;
移碼:
最高位為符號位,1表示正數,0表示負數。
正數(X)的移碼 = 2的n次冪 + X的補碼 = 符號位+本身 ;
負數(X)的移碼 = X的補碼 - 2的n次冪 = 符號位+(各位取反,末尾加一)
例如:X = +1011 , 補碼 = 01011 , 移碼 = 11011 ;
X = -1011 , 補碼 = 10101 , 移碼 = 00101 ;
二進制乘法運算:
一、定點數一位乘法:
注意:如果小數點后面有4位,則要進行右移4次,如果有6位,則要進行右移6次,依次類推。
在求部分積時,由於前一次部分積的最低位不再參與運算,因此可將其右移一位,相加數可直送而不必偏移,於是用N位加法器就可實現兩個N位數相乘。
部分積右移時,乘數寄存器同時右移一位,這樣可以用乘數寄存器的最低位來控制相加數(取被乘數或零0),同時乘數寄存器的最高位可接收部分積右移出來的一位,因此,完成乘法運算后,A寄存器中保存乘積的高位部分,乘數寄存器中保存乘積的低位部分。
(原碼右移,最高位補0)(補碼右移,最高位不變)
1.定點數原碼一位乘法:
[X·Y]的原碼 = [X]的原碼 · [Y]的原碼 = (符號位異或).(數值位兩個數絕對值之積) 。
例題:
答案:X·Y = 0.10001111
解析:第一步:因為乘數的最后一位是1,所以部分積應該+X,得00.1101,然后進行右移一位,將最后移出的那一位變成乘數的首位,乘數也進行右移一位,最后一位移出丟失。
第二部:重復上面的步驟。
因為小數點后面有四位,所以共需要進行4此移位,4次加法,最后符號位進行異或,判斷正負,得出結果。
注: (乘數的最后一位為1,部分積+X)
(乘數的最后一位為0,部分積+0)
2.定點補碼一位乘法:
定點原碼一位乘法用的是【原碼】進行運算,例如+X是加的X的原碼。
而定點補碼一位乘法用的是【補碼】進行運算,例如+X是加的X的補碼。
注:在[X·Y]中,如果Y為負數,需要補充進行(-[X]的補碼)操作;Y為正數,則不需要。
例如:
答案:[X·Y]的補碼 = 0.10001111
解析:因為Y為負數,所以最后要進行加上 (-[X]的補碼) 的操作。
3.布斯(Booth)公式:
乘數的 最后一位 - 前一位 = 0 ,則部分積 + 0 ;
乘數的 最后一位 - 前一位 = 1; 則部分積 + [X]的補碼 ;
乘數的 最后一位 - 前一位 = -1;則部分積 + [-X]的補碼 ;
最后一步不移位。
例如:
二、定點數二位乘法
注意:如果小數點后面有4位,則要進行右移2次,如果有6位,則要進行右移3次,和定點一位乘法不同。
原碼兩位乘法規則:
Y(i-1) | Y(i) | C | 操作 | 操作 |
0 | 0 | 0 | 部分積+0,右移2位 | 0->C |
0 | 0 | 1 | +X,右移2位 | 0->C |
0 | 1 | 0 | +X,右移2位 | 0->C |
0 | 1 | 1 | +2X,右移2位 | 0->C |
1 | 0 | 0 | +2X,右移2位 | 0->C |
1 | 0 | 1 | -X,右移2位 | 1->C |
1 | 1 | 0 | -X,右移2位 | 1->C |
1 | 1 | 1 | +0,右移2位 | 1->C |
解析:第一次乘數的最后兩位是11,而C的初始值是0,所以就是110,在上方表格中找到110,對應的操作是(-X,右移兩位,C賦值為1),用補碼來算,也就是+[-x]的補碼,然后將C賦值為1,重復上面的操作。