计算机组成原理里面有关于乘法和除法的算法的。首先它们算的都是二进制。然后计算机硬件实现的是加法、求非(求相反数)、移位(÷2、×2)
乘法的本质是加法,人的思维方式的这种乘法在计算机里叫做原码一位乘,
原码一位乘的过程是这样的:
10111*11001=
10111*
11011=
10111+
10111+
10111+
0+
10111+
10111
(果壳不要吞空格!求!)
对计算机来说,就是10111+10111*1,
然后10111左移一位,再加上去,再左移,不加,左移,加上去,左移,加上去得到最后得数。
要判断五次是否相加(是0就不加(废话))、加法不定次数、左移4次。
▲ 对两个正数来说,它们补码的乘积等于它们乘积的补码。若
乘数是负数时,这种情况就
不成立了。
原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以
纯小数为例)
1. 补码与真值的转换公式
设[
x]补 =
x0
.
x1
x2…
xn,有:
n
x = -
x0
+∑
xi
2-i
i=1
等式左边
x 为真值。此公式说明真值和补码之间的关系。
2. 补码的右移
正数右移一位,相当于乘1/2(即除2)。负数用补码表示时,右移一位也相当于乘1/2。因此,在补码运算的机器中,一个数不论其正负,连同符号位向右移一位(即符号扩展),若符号位保持不变,就等于乘1/2。
3. 补码乘法规则
设被乘数 [
x]补 =
x0
.
x1
x2…
xn 和乘数 [
y]补 =
y0
.
y1
y2…
yn (注意:包括符号位共
n+1位)均为任意符号,则有补码乘法算式
n
[
x·
y]补= [
x]补·( -
y0
+∑
yi
2-i )
i=1
为了推出串行逻辑(递推),实行分步算法,将上式展开加以变换:
[
x·
y]补 = [
x]补·[ -
y0 +
y12-1 +
y22-2 + … +
yn
2-
n]
= [
x]补·[ -
y0 + (
y1 -
y12-1) + (
y22-1 -
y22-2) + … +
(
yn
2-(
n-1)
-
yn
2-
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 - 1
yn 判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后,
yn - 1
yn 正好移到原来
ynyn+1 的位置上。依此类推,每步都要用
ynyn+ 1 位置进行判断,我们将这两位称为
判断位。
如果判断位
ynyn+1 = 01,则
yi+1-
yi = 1,做加[
x]补操作;
如果判断位
yn yn+1 = 10,则
yi+1 -
yi = - 1,做
加
[ -
x
]补(或者
-[
x]补)操作;
如果判断位
yn yn+1 = 11 或 00,则
yi+1-
yi = 0,[
zi ] 加0,即保持不变。
4. 补码一位乘法运算规则
(1) 如果 yn = yn+1,部分积 [ zi ] 加0,再右移一位;
(2) 如果 yn yn+1 = 01,部分积加[ x ]补,再右移一位;
(3) 如果 yn yn+1 = 10,部分积加[ - x]补
(或
减[
x]补
)
,再右移一位;
这样重复进行 n+1 步,但最后一步不移位(对纯小数)。包括一位符号位,所得乘积为 2n+1 位,其中 2n 为尾数位数。对于码整数相乘,最后一步也要移位!乘积有2n+2 位,其中 2n 为尾数位数。
【例 】
x
= 0
.
1101,
y = 0
.
1011,用补码一位乘法计算
x·
y
= ?
[
解
:]
求解过程如下:
所以
[x
·
y]补
= 0.10001111
http://img.blog.163.com/photo/YWMCGuemn618MupDNNsEhA==/1983554160880616992.jpg
http://img.blog.163.com/photo/umbxqMMe60IoK1F2AZJ5hw==/1983554160880616994.jpg
http://img.blog.163.com/photo/rHqQ2sJwW7iR7iEVyuudEA==/1983554160880616995.jpg
http://img.blog.163.com/photo/j1DpgRWIfWJrk06wn-GOew==/1983554160880616997.jpg
http://img.blog.163.com/photo/LiZDyobHjTApuc2rqQ7BJg==/5364631581128664751.jpg
http://img.blog.163.com/photo/dFpS7fdXDZAOs2_ejujfDA==/1983554160880616998.jpg
实现32位Booth乘法算法的流程图
例:用Booth算法计算2×(-3)。
解:[2]补=0010,[-3]补=1101,在乘法开始之前,R0和R1中的初始值为0000和1101,R2中的值为0010。
在乘法的第一个循环中,判断R1的最低位和辅助位为10,所以进入步骤1c,将R0的值减去R2的值,结果1110送人R0,然后进人第二步,将R0和Rl右移一位,R0和R1的结果为11110110,辅助位为l。
在第二个循环中,首先判断Rl的最低位和辅助位为0l,所以进入步骤1b,作加法,R0+R2=1111+0010,结果0001送入R0,这时R0R1的内容为0001 0110,在第二步右移后变为0000 1011,辅助位为0。
在第三次循环中,判断位为10,进入步骤lc,R0减去R2,结果1110送入R0,R1不变;步骤2移位后R0和R1的内容为1111 01011,辅助位为1。
第四次循环时,因两个判断位为11,所以不作加减运算,向右移位后的结果为1111 1010,这就是运算结果(—6)。
这个乘法的过程描述如下表所示,表中乘积一栏表示的是R0、R1的内容以及一个辅助位P,黑体字表示对两个判断位的判断。
除法人的思维是原码一位除,计算机一般使用补码除法…
大家都知道试商嘛,计算机试商简单:全部试成1就好。。
除法和乘法的速度比较主要看电子原件的设计和精度啦…差别没有人那么大…
现代计算机使用ALU算数逻辑单元(74181)实现运算。。通过标志位的选择,可以实现取非、减一、与非、与或等等操作。。。从计算量上面来说,除法和乘法差不多,过程上面都给出来了,由于电子元件不同、运算不同,只有有很细微的差别。这个差别远远小于阵列乘法器、阵列除法器、加法进位链等结构优化带来的差别。