最近在看补码乘法的时候,感觉到很奇怪的一点,那就是补码的一位乘法,就是上网查了大量的资料都没有理解到它真正的原理,总感觉还是不会。那么,补码乘法的原理到底是什么呢?而让我们一直困惑的点是哪里呢?其实就是寄存器中多了一个辅助位,而这也恰恰是困惑了很多人的点,为什么要多一个辅助位,而又为什么每次部分积相加时,到底加什么,需要用辅助位和辅助位的前一位的差来判断呢?相信很多朋友在这里都有疑惑,那么,下面开始慢慢说来。
网上很多人都根据补码的表示公式,一步一步推导出来的,但是这个我没看明白,给大家说另外一种个人认为相对简单的方法。那就是布斯编码。我们看下面的例子,假如现在我要算的是11010000*01111110,而这个计算,如下图:
我们计算的时候,是根据上面的竖式来计算的,原理就不说了,乘数中每位分别乘被乘数,然后在相加,这样的话,我们又6个非0的部分积,也就是要加6次,但是,我们可以把01111110写成10000000-00000010,这样的话我们就可以把原式写为11010000*(10000000-00000010),探后根据乘法分配律,写为11010000*10000000-11010000*00000010,这样的话,由以前的6次部分积的相加变成了2次部分积的相加,提高了乘法的效率。而10000000-00000010,看下图:
我们不借位,我们直接写成-1,那么此时其实01111110=100000-10,所以11010000*01111110=11010000*100000-10。这种就是布斯编码,看下图:
而我们可以根据上图得知01对应1,11对应0,00对应0,10对应-1,所以我们就得知了为什么补码一位的乘法运算中,算部分积的时候,到底加什么是由辅助位和前一位的差来决定的,而连续两位对应重新编码后的一位,所以我们就必须在乘数的最后补一位辅助位,来辅助完成乘法运算,而补得这位辅助位是0,刚好应对我们刚开始计算的时候,辅助位是0.而这也恰恰说明了为什么补码一位的乘法运算都是双符号位,因为我们在存放乘数的寄存器中,加了一位辅助位,而根据CPU内部总线的特征,所以导致其余的寄存器也是和他的bit位数相同,所以采用了两位的符号位。
以上是个人理解,难免有错误,希望大家指出。