布斯算法求补码乘积

不知道是上课没认真听讲,还是老师和课件讲得实在烂,反正我是被课件和网上的介绍给弄得很糊涂。明明很简单的算法,搞什么花里胡哨的来糊弄人。

布斯算法

贴一个网上的介绍:

说得很好,但是第三点,为什么要算术右移?部分积又是什么东西?根本没解释清楚。

正确的计算过程

举例2 * (-5)。首先规定下乘数和被乘数。这里以2为被乘数,-5为乘数。

先写出被乘数及其相反数的补码,以及乘数的补码。要写多少位呢?这是一个问题,事实上不是很重要,这是因为之后乘数是要改写的,从布斯算法的第二点可以看到11是不做任何操作的。但是要考虑溢出问题,就是补码的范围正负是不对称的,最小的那个数的相反数不在正数范围里,因此被乘数至少要是双符号位。其他应该不需要注意了,但我看网上一般都是把两个乘数的位数补齐。

-2:1110,2:0010,-5:1011。

然后把乘数改动,每一位变成前一位减当前位,则成为:(-1) 1 0 (-1)

然后直接相乘,-1时用-2的补码,1时用2的补码:

记得在加之前补齐符号位

结束。

可以看到布斯算法的思想在这种呈现方式中展现得淋漓尽致,就是把两位合成为一位,减少计算量。

可能有个bug就是在加到最后的时候溢出,此时要注意一下这个溢出会不会改变符号位,如果会应该多写几位。

但是这里根本就没什么右移,只有左移;也不知道部分积在哪。

课件上莫名其妙的解释

课件上的截图

上图的意思如下:乘数和被乘数固定为5位,然后红色是乘数,所谓右移,其实是乘数的右移!黑色部分右移了吗?右移了,但没有完全右移。你看它符号位倒是多了,但黑色的个位并没有因为右移而被抹去。

上图中黑色和红色其实是可以分开,但写在一起是为了迎合所谓的“右移”。注意在加的时候(比如第三步),X和-X永远是5位,事实上是它们左移了,而不是部分积右移!

所以我不知道为什么要这样教,难道这能体现出布斯算法的思想?抑或是这样更容易让早八的大学生懂???????我实在是不理解。