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

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

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

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

相关推荐

  1. ThreadLocal

    2024-07-10 19:18:04       16 阅读
  2. 特定律

    2024-07-10 19:18:04       15 阅读
  3. 深入理解GPIO概念

    2024-07-10 19:18:04       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 19:18:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 19:18:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 19:18:04       45 阅读
  4. Python语言-面向对象

    2024-07-10 19:18:04       55 阅读

热门阅读

  1. 学习数据库的增删改查

    2024-07-10 19:18:04       17 阅读
  2. oracle 数据更新procedure 模板

    2024-07-10 19:18:04       20 阅读
  3. 【LeetCode 0050】【分治/递归】求x的n次方

    2024-07-10 19:18:04       20 阅读
  4. Qt图形编辑类使用总结—正在编辑中

    2024-07-10 19:18:04       12 阅读
  5. Spring Boot与Apache Kafka Streams的集成

    2024-07-10 19:18:04       19 阅读
  6. uniapp 封装瀑布流组件

    2024-07-10 19:18:04       20 阅读