計算機中實現乘法運算有兩種方式, 使用原碼實現和使用補碼實現.
使用原碼並行乘法
使用原碼事項乘法的方式, 類似於筆算乘法, 符號位使用異或電路實現.
運算過程: 加法 + 移位
有成熟的末位決定被乘數是否與原部分積相加, 部分積右移移位形成新的部分積. 部分積 就是被乘數乘以乘數積的其中一行.
定義公式:
[x]原=x0.x1 x2…xn[x]原=x0.x1 x2…xn∴[x⋅y]原=(x0⊕y0)+(x1x2…xn)⋅(y1y2…yn)
例1: $A = -0.1101 \quad B=0.1011 $
直接算: ⇒A×B=−0.10001111
根據公式計算:
[A]原=1.1101[B]原=0.1011
[x⋅y]原=(1⊕0)+(0.10001111)=[1.10001111]原=−0.10001111
移位操作
- 邏輯左移(LSL)和邏輯右移(LSR): bit位向左右移, 空出來的使用
0
補全
- 算術左移(ASL)和算術右移(ASR): 算術左移同邏輯左移; 算術右移, bit位向右移, 空出來的使用符號位補全
第一類移動是將bit位簡單移動, 不考慮計算因素, 第二類是在計算中的移位, 在補碼運算中意義重大.
正、負數補碼(算術)右移的意義
- 正數右移相當於對被操作數進行整除
- 負數右移也是對被操作數進行整除, 需要注意: 如果有餘數, 結果-1; 負數整除最大值爲-1;
定點小數真值和補碼的另一關係
[X]補=X0.X1X2…Xn
[X]原=−X0+0.X1X2…Xn
例:
[1.11]補=−1+0.11=−1+0.11=[−0.01]真
[1.1]補=−1+0.1=[−0.1]真
補碼乘法規則
設被乘數 [x]補=x0.x1x2…xn , 乘數 [y]補=y0.y1y2…yn
- 若被乘數任意, 乘數爲正
- 同原碼乘法規則, 但加法和移位操作按補碼規則運算
- 乘積的符號自然形成
- 公式爲: [x⋅y]補=[x]補(0.y1y2…yn)
--無需校正
- 拖被乘數任意, 乘數爲負
- 乘數 [y]補 , 去掉符號位, 操作同上
- 運算完成後, 需對結果加 [−x]補 校正
- 公式爲: [x⋅y]補=[x]補(0.y1y2…yn)+[−x]補
**統一補碼乘法公式: ** [x⋅y]補=[x]補(0.y1y2…yn)+[−x]補⋅y0
Booth算法
運算規則
- 符號位參與運算, 運算數均以補碼錶示
- 被乘數一般去雙符號位參與運算
- 乘數可取單符號位
- 乘數末位增設附加爲Yn+1 , 切初值爲0
- 操作按下表
- 最後一步無需移位
Yn |
Yn+1 |
操作 |
0 |
0 |
部分積右移移位 |
0 |
1 |
部分積加 [x]補 , 右移一位 |
1 |
0 |
部分積加 [−x]補 , 右移一位 |
1 |
1 |
部分積右移一位 |
運算過程
Booth運算電路邏輯圖
總結
計算集中乘法是通過加法實現的, 這裏的加法不是簡答的累加(例 4*5, 不是把4累加5次), 而是通過移位相加的方式, 通過計算機Booth算法進行乘法運算時最多相加次數爲除數位數減1次.