原码一位乘(详解+个人理解)
前提引入
我们人类进行正常的二进制数相乘时,可以通过竖式运算,轻松的得到结果。可是这个操作,我们实际上在无意中却进行了多个二进制数的累加。这对计算机来说十分困难,计算机只能进行两个二进制数的相加。因此,就出现了一位乘。
原理
一位乘实际上就是进行模拟人类的运算,只不过把步骤分解开来而已。
总结个口诀吧: ==乘完一位加一位,丢弃用完的一位,右移一位存一位。
首先拿来三个寄存器ABC,分别存放被乘数,乘数和部分积。
所谓部分积,顾名思义,就是当前的积。因为我们一位乘是一步一步进行累加的,所以得到的积称作部分积。
- 先来说A寄存器。它的作用就是把竖式计算里的被乘数放在那。是的。被乘数总得有个载体。我们实际运算是写在纸上,肉眼看到并进行下一步。这个过程在计算机中可以进行类比。纸张就是我们的寄存器,肉眼看到就是加法器提取数据的过程。
- 再来说B寄存器。首先,他有着和A寄存器类似的功能,也就是让我们能看见乘数。其次,就是前面所提到口诀中的后两句话:扔一位,存一位。
- 扔一位?仍的是哪一位?
扔的就是乘数的最后一位。因为我已经用它乘过被乘数了。事实上,我们在竖式运算时也无意中进行了舍弃。那这一位用完了没用了,我们就可以把他丢掉,从寄存器里删除。 - 存一位?存的是哪一位?
存的是算完的最低位。我们还是回归到人工计算上,是不是每次乘完一位,最低位实际上已经确定了?因为我们都是从小往大去乘,最后累加也是把高位也好低位也好一股脑地各自加起来。只不过计算机拆分了这个过程,我们就先把低位的值算完存起来。 - 存到哪里?
好问题。就是存到乘数寄存器中,也就是B。我们正好扔了一位,有了空位置,就可以存已经算好的低位。 - 为什么要右移?
正如人工计算,我们前一次部分积的最低位不再参与运算。我们没有改变每个数的权值,只是把更高位没写出来的0给补出来了。也可以理解成把原来不断左移的部分不动,变成了部分积右移。两种理解都可以,实际上是一个意思。 - 最后来说C寄存器。在计算过程中,低位数值被不断的送往B中,最后留下的只有高位数值。
在计算机计算完成后,把C中的值和B中的值进行合并,就自然地得到了从高位到低位的计算结果。
至于符号位则是通过异或运算得到,++,–得到0,也就是正。±,-+得到1,也就是负。
非常合理。 至此,我们就完成了原码一位乘。
那我们来总结一下手算原码一位乘的过程吧。
- 求x和y的绝对值,
- 根据法则进行一位乘
- 根据xy的正负补上符号位
- 顺着写出来结果
end