其他专栏收录该内容
40 篇文章0 订阅
订阅专栏
http://www.guokr.com/question/445105/?page=1
为什么除法比乘法难?
比如说吧。
7.6*2.5=19 不管怎么看都要比 19/7.6=2.5 要简单。
而且程序上计算乘法比计算除法占的处理器也少,貌似是这样?
求解。
8人关注关注
3个答案
计算机组成原理里面有关于乘法和除法的算法的。首先它们算的都是二进制。然后计算机硬件实现的是加法、求非(求相反数)、移位(÷2、×2)
乘法的本质是加法,人的思维方式的这种乘法在计算机里叫做原码一位乘,
原码一位乘的过程是这样的:
10111*11001=
(果壳不要吞空格!求!)
对计算机来说,就是10111+10111*1,
然后10111左移一位,再加上去,再左移,不加,左移,加上去,左移,加上去得到最后得数。
要判断五次是否相加(是0就不加(废话))、加法不定次数、左移4次。
对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。
原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以纯小数为例)
1.补码与真值的转换公式
设[x]补=x0.x1x2…xn,有:
n
x=-x0+∑xi2-i
i=1
等式左边x为真值。此公式说明真值和补码之间的关系。
2.补码的右移
正数右移一位,相当于乘1/2(即除2)。负数用补码表示时,右移一位也相当于乘1/2。因此,在补码运算的机器中,一个数不论其正负,连同符号位向右移一位(即符号扩展),若符号位保持不变,就等于乘1/2。
3.补码乘法规则
设被乘数[x]补=x0.x1x2…xn和乘数[y]补=y0.y1y2…yn(注意:包括符号位共n+1位)均为任意符号,则有补码乘法算式
n
[x·y]补=[x]补·(-y0+∑yi2-i)
i=1
为了推出串行逻辑(递推),实行分步算法,将上式展开加以变换:
[x·y]补=[x]补·[-y0+y12-1+y22-2+…+yn2-n]
=[x]补·[-y0+(y1-y12-1)+(y22-1-y22-2)+…+(yn2-(n-1)-yn2-n)]
=[x]补·[(y1-y0)+(y2-y1)2-1+…+(yn-yn-1)2-(n-1)+(0-yn)2-n]
=[x]补·[...................................](yn+1=0)
写成递推公式如下:
[z0]补=0(赋初值0)
[z1]补=2-1{[z0]补+(yn+1-yn)[x]补}(yn+1=0)
;注:2-1表示右移,带符号扩展。补码的加减法在移位时不考虑进位C
[zi]补=2-1{[zi-1]补+(yn-i+2-yn-i+1)[x]补}
[zn]补=2-1{[zn-1]补+(y2-y1)[x]补}
[zn+1]补=[zn]补+(y1-y0)[x]补=[x·y]补此最后一步不需要移位(对纯小数!)
开始时,部分积为0,即[z0]补=0。然后每一步都是在前次部分积的基础上,由(yi+1-yi)(i=0,1,2,…,n)决定对[x]补的操作,再右移一位,得到新的部分积。如此重复n+1步,最后一步不移位,便得到[x·y]补,这就是有名的Booth布斯算法。
实现这种补码乘法规则时,在乘数最末位后面要增加一位补充位yn+1。开始时,由ynyn+1判断第一步该怎么操作;然后再由yn-1yn判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后,yn-1yn正好移到原来ynyn+1的位置上。依此类推,每步都要用ynyn+1位置进行判断,我们将这两位称为判断位。