补码一位乘法原理(布斯编码详讲)

最近在看补码乘法的时候,感觉到很奇怪的一点,那就是补码的一位乘法,就是上网查了大量的资料都没有理解到它真正的原理,总感觉还是不会。那么,补码乘法的原理到底是什么呢?而让我们一直困惑的点是哪里呢?其实就是寄存器中多了一个辅助位,而这也恰恰是困惑了很多人的点,为什么要多一个辅助位,而又为什么每次部分积相加时,到底加什么,需要用辅助位和辅助位的前一位的差来判断呢?相信很多朋友在这里都有疑惑,那么,下面开始慢慢说来。

网上很多人都根据补码的表示公式,一步一步推导出来的,但是这个我没看明白,给大家说另外一种个人认为相对简单的方法。那就是布斯编码。我们看下面的例子,假如现在我要算的是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位数相同,所以采用了两位的符号位。

以上是个人理解,难免有错误,希望大家指出。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值