原码⼀位乘法c语⾔程序,原码⼀位乘法与补码⼀位乘法
原码1位乘法
在定点计算机中,两个原码表⽰的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到,⽽乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数⽤定点⼩数表⽰(定点整数也同样适⽤)
被乘数[x]原 = xf.x0x1x2…xn
乘数[y]原 = yf.y0y1y2…yn
乘积 [ z]原 = ( xf⊕yf) . (0. x0x1x2…xn)(0 . y1y2…yn)
式中,xf为被乘数符号,yf为乘数符号。
乘积符号的运算法则是:同号相乘为正,异号相乘为负。由于被乘数和乘数和符号组合只有四种情况(xfyf = 00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。
数值部分的运算⽅法与普通的⼗进制⼩数乘法相类似,不过对于⽤⼆进制表达的数来说,其乘法规则更为
简单⼀些:从乘法y的最低位开始,若这⼀位为“1”,则将被乘数x写下;若这⼀位为“0”,则写下全0。然后再对乘数y的⾼⼀位进⾏的乘法运算,其规则同上,不过这⼀位乘数的权与最低位乘数的权不⼀样,因此被乘数x要左移⼀位。依次类推,直到乘数各位乘完为⽌,最后将它们统统加起来,便得到最后乘积z。
设 x = 0.1011,y = 0.1101,让我们先⽤习惯⽅法求其乘积,其过程如下:
×
0.
1
1
1
(x)
0.
1
1
1
(y)
+
1
1
1
1
1
1
1
1
1
0.
1
1
1
1
1
(z)
如果被乘数和乘数⽤定点整数表⽰,我们也会得到同样的结果。但是,但是⼈们习惯的算法对机器并不
完全适⽤。原因之⼀,机器通常只有n位长,两个n位数相乘,乘积可能为2n位。原因之⼆,只有两个操作数相加的加法器,难以胜任将n个位积⼀次相加起来的运算。为了简化结构,机器通常只有n位长,并且只有两个操作数相加的加法器。为此,必须修改上述乘法的实现⽅法,将 x· y改写成适于如下定点机的形式:
⼀般⽽⾔,设被乘数 x、乘数 y都是⼩于 1 的 n 位定点正数:
x = 0 . x1x2… xn  ;  y = 0 . y1y2…yn
其乘积为
x· y =  x ·( 0.y1y2… yn)
= x · ( y12 -1 + y22 -2 + … + yn2 -n)
= 2 -1( y1x + 2-1( y2x + 2-1(… + 2-1( yn-1x + )…))
令zi 表⽰第 i 次部分积,则上式可写成如下递推公式:
z0 = 0
z1 = 2-1( ynx + z0)
zi = 2-1( yn-i+1x + zi-1)(2.3.2)
zn = x·y = 2-1( y1x + zn-1)
显然,欲求x·y,则需设置⼀个保存部分积的累加器。乘法开始时,令部分积的初值z0 = 0,然后求加上ynx,右移1位得第1个部分积,⼜将加上yn- 1x,再右移1位得第2个部分积。依此类推,直到求得y1x加上zn-1并右移1位得最后部分积,即得x·y。显然,两个n位数相乘,需重复进⾏n次“加”及“右移”操作,才能得到最后乘积。这就是实现原码⼀位乘法的规则。
【例 】x = 0.1101, y = 0.1011,⽤原码⼀位乘法计算 x · y=?
[解:]求解过程如下:            Flash演⽰
部分积
乘数
说明
00.0000
yf
1
1
1
z0 = 0
+
00.1101
y4 = 1,+x
00.1101
00.0110
1
yf
1
1
右移,得z1
+
00.1101
Y3 = 1,+x
01.0011
00.1001
1
yf
1
小数的原码右移,得z2
+
00.0000
Y2 = 0,+0
00.1001
00.0100
1
1
1
yf
1
右移,得z3
+
00.1101
Y1 = 1,+x
01.0001
00.1000
1
1
1
1
yf
右移,得z3 = xy
所以x · y = 0.10001111
图2-7 为实现原码⼀位乘法的硬件逻辑原理图。这⾥有三个寄存器,其中 R0 存放部分积z,在乘法开始 R0前应清“0”,保证 z0 = 0,R1 寄存器存放乘数 y,R2寄存器存放被乘数x。由于乘法开始时先从乘数的最
低位 yn 开始,以后则使⽤yn- 1,yn- 2,…,y1,因此乘数寄存器 R1应当是具有右移功能的移位寄存器。
假定加法器不具备右移功能,那么由于部分积需要右移,R0也应当是具有右移功能的移位寄存器。
图2-7        原码⼀位乘法逻辑结构原理图
除了三个寄存器 R0,R1,R2 外,还需⼀个加法器和⼀个计数器,前者完成部分积与位积的累加,后者对移位的次数进⾏计数,以便判断乘法运算是否结束。
乘法开始时,“启动”信号使控制触发器 Cx 置“1”,于是开启时序脉冲 T 。当乘数寄存器 R0 最末位为“1”时,部分积z 和被乘数
x 在加法器中相加,其结果输出⾄ R0 的输⼊端,⼀旦打⼊控制脉冲 T,控制信号 LDR0 使部分积右移 1 位,与此同时,乘数寄存
器 R1 也在控制信号 LDR1 作⽤下右移⼀位,且计数器i计数 1 次。当计数器 i = n时,计数器i的溢出信号使控制触发器 Cx置“0”,关闭时序脉冲T,乘法操作结束。如果将 R0 和 R1连接起来,乘法结束时乘积的⾼ n 位部分在 R0 ,低 n位部分在 R1 ,R1 中原来的乘数y由于右移⽽全部丢失,乘积为 2n+1 位,其中包括 1 位符号位。
补码1位乘法
原码乘法的主要问题是符号位不能参加运算,单独⽤⼀个异或门产⽣乘积的符号位。故⾃然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码⼀位乘法的规律,先从补码和真值的转换公式开始讨论。
1.补码与真值的转换公式
设 [x]补 = x0. x1x2…xn,有:
n
(2.3.3)
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
(2.3.4)
[ 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)
写成递推公式如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。