x * y = z
運算規則:
1.和原碼一位乘法不同,補碼一位乘法的符號位是參加運算的,且運算結果和所有參加運算的數都是補碼形式。
2.乘數 x 取雙符號位參與運算,部分積的初始值為0;
乘數 y 取單符號位參與運算。
3.乘數 y 首先在末尾添加一個輔助位 0 ,每次討論都是取 y 的最后兩位,但每次移動僅移動一位。
4.判斷 y 的最后兩位是規則如下:
- 00 或者 11 時,直接右移一位;
- 01 時,先加 x 的補,然后右移一位;
- 10 時,先加 -x 的補,然后右移一位。
5.有個特例,最后一步不用右移了。
舉個栗子:
設 x = -0.1101 , y = 0.1011
則 [x]補 = 11.0011 ,[-x]補 = 00.1101
一開始 部分積初始值:00.0000
先給y補一個輔助位0,得到 y = 0.10110
首先,從y的最后兩位開始看,0.10110 ,為 10 ,對應規則 “先加[-x]補,再右移一位” :
部分積 00.0000 + 00.1101 = 00.1101 ,右移一位得到 00.01101
接着,y 右移一位再看,0.10110,為 11 ,對應規則“直接右移一位”:
部分積 00.001101
然后,y再右移一位再看,0.10110 ,為 01 ,對應規則“先加[x]補,再右移一位”:
00.001101 部分積
+ 11.0011 [x]補
--------------------
= 11.011001 部分積
部分積 00.001101 + 11.0011 = 11.011001 ,右移一位得到 11.1011001 (注意這里符號位移動后,仍然保持為 11 )
接着,y再右移一位再看,0.10110 ,為 10 ,對應規則“先加[-x]補,再右移一位”:
部分積 11.1011001 + 00.1101 = 00.1000001 ,右移一位得到 00.01000001
最后,y再右移一位再看,0.10110 ,為 01 ,對應規則“先加[x]補,再右移一位”:
部分積 00.01000001 + 11.0011 = 11.01110001 ,但這已經是最后一步,不用再右移了,
所以最后結果是 1.01110001 (注意:這是x*y的補碼)