十进制数的乘法相信大家都很熟悉,比如985*211,我们来分析一下这个过程,先用乘数的末位*被乘数,再用倒数第二位*被乘数,并错位(向前移动一格),以此类推
二进制也是如此,我们举个例子:X=0.1101,Y=0.1011,在计算机存储中是这样摆放的:
我们来计算一下:我们也可以发现,4位*4位,结果不会超过2*4=8位,所以n位和n位相乘,结果小于等于2n位
Y=0.1011,小数点后第一位是2的-1次方,第二位是2的-2次方,第三位是2的-3次方,第四位是2的-4次方
我们采取每次提出一个2的-1次方的方式循环,这样可以进行每次加法操作后,左移一位
Cout:进位输出,初始值是0
ACC:累加器,用于暂存运算中的结果,初始值为0000
MQ:乘商寄存器,在乘除运算中存放乘数、商等信息
计数器Cn:取决于位数,如果位数是4,初始值就是Cn=4,每执行一次,减一,比如下一次就是Cn=3
被乘数X放在乘数寄存器中(图中的X处),然后进入ALU(算术逻辑单元)与ACC中的值进行加法运算
我们一步一步来分析:
(Y是指MQ中的最后一位,Y==1时,Pi+X,整体右移,Y==0,整体右移,为什么右移?因为我们化简到最后,其实是每一步操作后都乘2的-1次方,也就是除以2,除运算是右移)
初始,X中存放x的数据是1101,Cout初始值为0,ACC初始值为0000,MQ存放乘数Y=1011(第一行数据,看表),Cn=4
第二步:ACC中的0000和X中的1101相加,结果是1101,所以ACC数据更新为1101,此时没有进位,所以Cout=0,MQ依然是Y=1011(第二行数据,看表)
第三步:我们发现Y==1,此时P0=0,P0+X=1101,右移,没有进位,Cout=0,ACC的数据更新为0110,MQ的数据更新为1101(这里我想用没那么专业的话术跟大家说一下,ACC的右移,其实就是把Cout的值推过来,作为首位,然后ACC的数值一次往后移一位,比如cout=0,ACC=1101,ACC右移,把Cout的值作为ACC的首位,就是0110(最后一位1移除))
第四步:Cn=3,此时Y==1,ACC+X=0110+1101=0011(进位1),所以Cout=1,整体右移,ACC更新为1001,MQ更新为1110,Cout更新为0(对比第五行数据,看表)
第五步:Cn=2,此时,Y==0,直接整体右移,ACC的值为0100,MQ的值为1111(对比第六行数据,看表)
第六步:Cn=1,此时Y==1,ACC+X=0100+1101=0001,进位1,即Cout=1(看第七行数据),整体右移,Cout=0,ACC更新为1000,MQ为1111(看第八行数据)
Cn=0,运算结束!!结果是0.10001111(ACC和MQ从左往右合并)
所以结果是