1. 程式人生 > >定點乘法運算之原碼一位乘法

定點乘法運算之原碼一位乘法

x * y = z
討論已知x和y的情況下,怎麼通過原碼一位乘法方法得出z~~
首先說下運算規則~
1. z的符號位通過x和y的符號位進行異或運算得到~(這個很好理解噠,負負得正,正正得正,正負得負嘛~所以把符號位異或得到的結果就是乘法運算後應該的結果咯~)
2. 所以就不用討論x和y的符號位啦,z除了符號之外的其他部分由x的絕對值乘以y的絕對值得到~
1、2兩點總結一下就是說:被乘數和乘數均取絕對值參加運算,符號位單獨考慮~

我們手工進行乘法運算的時候,是通過y從右往左每一位都和x相乘,(乘完一次就往前縮排一個數位)然後把結果相加得到的~機器也是這樣運算噠~不過機器為了節約空間,畢竟按照手算的方法那樣兩個n位相乘最後可能會需要2n的長度空間才能得到結果,計算機是採用把每次用y的一位和x相乘的結果(叫做部分積)累加後右移一位,再處理y當前位的下一位的~

3. 我們把被乘數x先取雙符號,而且讓部分積初始值為0,並且長度和被乘數x相同(就是添0讓長度相同的意思啦~)

計算機只有0和1,所以處理乘法的時候運演算法則遠沒有99乘法表那麼複雜,運算規則為:

4. 從y的最後一位開始(一直到第一位)分別與x相乘:

  • 當y的當前位為1,則部分積加上x的絕對值
  • 當y的當前位為0,則部分積加上0

5. 右移一位,在前面加0。不斷處理y的每一位,知道y的所有位都處理過為止~~

可能有點暈,舉個栗子~

比如x = 0.1101  ,y = 0.1011

1、先把部分積設為初始值0(長度擴充套件到和x相同),即

  1. 00.0000
  2. y的最後一位是1,所以要加上x的絕對值:
    00.0000 + 00.1101 = 00.1101
  3. 右移1位,前面補0,變成了00.01101

     

  4. 2、好啦,下面處理y的倒數第二位,還是1,繼續加x的絕對值:

  5. 00.01101 + 00.1101 = 01.00111
  6. 別忘記右移1位,前面補0,這樣就變成了00.100111

     

  7. 3、y倒數第3位是0,只要加0就好了(加0的結果還是本身啊。),所以還是:00.100111

  8. 既然加了0,別忘記右移一位哦,所以變成了00.0100111

     

  9. 4、y還剩最後一個位(也就是第一位)沒處理啦,第一位是1哦,那就加上x的絕對值:

  10. 00.0100111 + 00.1101 = 01.0001111
  11. 別忘記右移一位!所以最後結果是 00.10001111~~~

嗯好啦,這就是最後結果~~不過雙符號位就變成一個0就好咯,也就是最後結果為0.10001111~~~