原碼乘法:
原碼的手動乘法:就和小學學過的豎式乘法寫法一致,從右到左,乘數每一位分別與被乘數相乘。
1011
x 1101
-------------------
1011
0000
1011
1011
----------------
10001111
原碼的一位乘法:
原理:從傳統豎式乘法里面可以看到,每次乘數只有一位與被乘數相乘。如果用乘數的最低位和被乘數相乘,再把它右移一位,就可以作為部分積,和下一位相乘后的結果相加。
具體計算:
符號位最后單獨處理,絕對值參加乘法運算。該算法因為每次根據乘出的一位來計算位積,所以稱為原碼一位乘法。
步驟:初始部分積為0,Yi為1;若Yi為0,部分積加|X|,累加結果右移一位,得到新部分積;(i依次為n n-1 n-2....)
符號位異或運算。
(為什么要右移:對於乘數,最后一位已經用過了,沒有價值,所以直接右移丟棄掉,剩下的空間剛好用來存儲部分積右移的部分。換句話說,部分積可以視為在乘數左側,每次右移擠占乘數空間)
例題:
以+1011 * -1101為例做一位乘法
初始的部分積為0,0000,0表示正數,不參與計算。部分積實際為0000. 數據顯示:0000 1101
1)用乘數1101的最后一位1乘1011 並加上之前的部分積0000,結果為1011,
部分積右移一位,擠占乘數1101的位置,乘數變成了1110,部分積變成0101 數據顯示: 0101 1110
2)用乘數1110的最后一位0乘1011,並加上部分積,結果為0101 數據顯示: 0101 1110
部分積右移,擠占乘數,乘數變成1111,部分積變成0010 數據顯示: 0010 1111
3)用乘數1111的新最后一位1乘1011,並加上部分積,結果為1101 數據顯示: 1101 1111
部分積右移,擠占乘數,乘數變成1111,部分積變成0110 數據顯示: 0110 1111
4)用乘數1111的新最后一位1乘1011,並加上部分積,結果為0001 數據顯示: 0110 1111
部分積右移,擠占乘數,乘數變成1111,部分積為1000 數據顯示:1000 1111
與乘數1111拼接
最終結果為1,1000 1111 前面的1表示負數
-------------
補碼一位乘法
在計算機中用補碼運算較為方便。補碼乘法運算時,可以將補碼的數值部分同原碼一樣直接做乘法,在根據乘數符號位做修正即可。
在修正X*Y時,Y的符號位為0不用修正,Y的符號位為1 時減去X
此外,補碼的符號位可以直接參加運算,不用單獨處理;並且他們需要兩位符號位
舉例:
X為+0.1011 Y為-0.1101
轉化為補碼后,X為00.1011 Y為11.0011
計算大致同上述步驟。由於Y的符號位為11,因此計算結果00.0010 0001要減去X補碼,也就是加上-X補碼
實際結果為1.0111 0001
轉化為原碼是-0.1000 1111
轉換為原碼的話為-0.1000 1111
