原码一位乘法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
0
1
(x)
0.
1
0
1
1
(y)
+
1
1
0
1
1
1
0
1
0
0
0
0
1
1
0
1
0.
1
0
0
0
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
0
1
1
z0 = 0
+
00.1101
y4 = 1,+x
00.1101
→
00.0110
1
yf
1
0
1
右移,得z1
+
00.1101
Y3 = 1,+x
01.0011
→
00.1001
1
1
yf
1
0
右移,得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)
写成递推公式如下:
[ z0]补 = 0
[ z1]补 = 2 -1{ [ z0]补+ (yn+1 - yn) [x]补} (yn+1 = 0)
…
[ zi]补 = 2 -1{ [ zi-1]补+ (yn-i+2- yn-i+1) [x]补 } (2.3.5)
…
[ 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]补,这就是有名的布斯公式。
实现这种补码乘法规则时,在乘数最末位后面要增加一位补充位 yn+1 。开始时,由 ynyn+1判断第一步该怎么操作;然后再由 yn - 1yn 判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后, yn - 1yn 正好移到原来 ynyn+1的位置上。依此类推,每步都要用 ynyn+ 1 位置进行判断,我们将这两位称为判断位。
如果判断位 ynyn+1 = 01,则 yi+1 … yi = 1,做加[x]补操作;如果判断位 ynyn+1 = 10,则 yi+1 … yi = - 1,做加[ - x]补操作;如果判断位 ynyn+1 = 11 或 00,则yi+1… yi = 0,[ zi] 加0,即保持不变。
4. 补码一位乘法运算规则
(1)如果 yn = yn+1,部分积 [ zi] 加0,再右移一位;
(2)如果 ynyn+1 = 01,部分积加[ x]补,再右移一位;
(3)如果 ynyn+1 = 10,部分积加[ - x]补,再右移一位;
这样重复进行 n+1 步,但最后一步不移位。包括一位符号位,所得乘积为 2n+1 位,其中 n 为尾数位数。
【例 】x = 0.1101, y = 0.1011,用补码一位乘法计算 x · y=?
[解:] 求解过程如下: Flash演示
部分积
乘数
说明
00.0000
0.
1
0
1
1
0
yn+1 = 0
+
11.0011
ynyn+1 = 10,加[-x]补
11.0011
→
11.1001
1
0
1
0
1
1
右移一位
+
00.0000
ynyn+1 = 10,加0
11.1001
→
11.1100
1
1
0
1
0
1
右移一位
+
00.1101
ynyn+1 = 01,加[x]补
00.1001
→
00.0100
1
1
1
0f
1
0
右移一位
+
11.0011
ynyn+1 = 01,加[-x]补
11.0111
→
11.1011
1
1
1
1
0
1
右移一位
+
00.1101
ynyn+1 = 01,加[x]补
00.1000
1
1
1
1
0
1
最后一步不移位
所以 [x · y]补 = 0.10001111
图2-8 补码一位乘法逻辑原理图
实现一位补码乘法的逻辑原理图如图 2-8 所示,它与一位原码乘法的逻辑结构非常类似,所不同的有以下几点:
(1) 被乘数的符号和乘数的符号都参加运算。
(2) 乘数寄存器 R1有附加位 yn+1,其初始状态为“0”。当乘数和部分积每次右移时,部分积最低位移至 R1的首位位置,故 R1必须是具有右移功能的寄存器。
(3) 被乘数寄存器 R2 的每一位用原码(即触发器 Q 端)或反码(即触发器 Q 端)经多路开关传送到加法器对应位的一个输入端,而开关的控制位由和 yn 的 yn+1输出译码器产生。当ynyn+1 = 01时,送[x]补;当 ynyn+1 = 10 时,送[-x]补,即送的反码且在加法器最末位上加“1”。
(4) R0保存部分积,它也是具有右移功能的移位寄存器,其符号位与加法器 ∑f 符号位始终一致。
(5) 当计数器 i = n +1 时,封锁 LD R0 和 LD R1 控制信号,使最后一位不移位。
执行补码一位乘法的总时间为
tm= ( n +1 ) ta+ ntr
(2.3.6)
其中n 为尾数位数,ta为执行一次加法操作的时间,tr为执行一次移位操作的时间。如果加法操作和移位操作同时进行,则tr项可省略。
原码一位乘法c语言程序,原码一位乘法与补码一位乘法相关推荐
- 格雷码转换成二进制c语言程序,格雷码与二进制的转换程序
/* 格雷码与二进制的转换程序 * 本程序采用递推的方法进行推导,可以转换0~2147483647之间的数(1~31位) * 推导方式如下(以三位格雷码为例): * 序号 格雷码 格雷码实值 二进制码 ...
- 九宫格心形拼图小程序源码/带流量主微信小程序源码
九宫格心形拼图小程序源码/带流量主微信小程序源码 ☑️ 编号:ym476 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:500KB ☑️ 类型:九宫格心形拼图 ☑️ 支持:微信小程序
- 仿京细菜谱微信小程序源码 云开发菜谱微信小程序源码
京细菜谱是一个美食分享网站,提供优质的家常菜谱大全,仿京细菜谱小程序源码为喜欢美食的朋友提供了很多的美食烹饪教程 让您轻松学会做美食.对不同食材和地域的饮食做了不同的分类和详细的做菜方法 分类十分详细 ...
- 小程序源码:求职招聘微信小程序源码下载v4.1.78
1.多城市招聘平台2.职位版块 3.人才版块 4.招聘会(支持企业在线报名参加招聘会) 5.职场资讯6.企业登录(在手机端可操作企业信息编辑.发布职位.查收简历.通知面试) 7.企业VIP套餐购买功能 ...
- 小程序源码:拼图工具箱微信小程序源码下载支持多种拼图模式制作
这是一款拼图工具箱小程序源码 小程序支持多种拼图制作生成 比如: 九宫格切图(就是把一张图切割成九宫格小图) 九宫格拼图(就是把九张图拼成一张图) 心形图制作(也就是把多张图拼成心形状态) 文字九宫格 ...
- 小程序源码:图片拼图微信小程序源码下载
该款小程序支持多种流量主 另外支持多种图形模板制作切割 另外也支持长图合成等功能 安装简单,新手容易上手,具体就不多说了大家自行研究吧! 小程序源码下载地址: 小程序源码:图片拼图微信小程序源码下载- ...
- 小程序源码:游戏助手微信小程序源码王者荣耀战力查询,游戏扫码登录器-多玩法安装简单
这是一款游戏助手小程序源码,UI方面的话还是挺简单,小编个人看着挺舒服的 小程序内支持多种热门游戏扫码登录,也就是说是一个游戏登录器 比如英雄联盟,王者荣耀,和平精英等等热门游戏都支持 另外还有王者战 ...
- 小程序源码:图片拼图微信小程序源码-多玩法安装简单
该款小程序支持多种流量主 另外支持多种图形模板制作切割 另外也支持长图合成等功能 安装简单,新手容易上手,具体就不多说了大家自行研究吧! 小程序源码下载地址: 小程序源码:图片拼图微信小程序源码-多玩 ...
- 天气预报小程序源码,天气类微信小程序源码。API使用的是和风天气。
天气预报小程序源码,天气类微信小程序源码.API使用的是和风天气. 可以提供实时全国天气气象信息,及时发布天气预报.灾害预警.气象云图.旅游天气.台风.暴雨雪等气象信息, 为我国的生产生活提供全面精确 ...
- 基于51单片机控制的篮球比赛计时、计分系统设计与仿真(含设计图和C语言程序源码)
1. 设计任务: 2. 设计说明 2.1 需求分析 2.1.1 计分系统: 2.1.2 计时系统: 2.2 原理分析 2.3 总体设计 2.4 软硬件设计 2.4.1 硬件设计 2.4.2 软件设计 ...
最新文章
- python的类和对象_Python类与对象实验
- Facebook最新语音算法曝光!自监督语音识别,错误率低至2.43%
- 在移动安全领域,人工智能未来该扮演怎样的角色?
- 我所理解cocos2d-x 3.6 lua --使用Cocos Studio
- 国外方案 组件化_网页webp解决方案
- MATLAB如何用循环分割,利用Matlab进行分割提取浮游生物
- 图像分割的「奇技淫巧」
- 机器学习之分类性能度量指标 : ROC曲线、AUC值、正确率、召回率
- Java发送GET/POST请求
- java匿名内部对象_JavaSE 学习参考:匿名内部类和匿名对象
- CaseStudy-数据缓存出错
- 决策的五个要素 by 彼得。德鲁克
- java 冗余,java代码冗余
- UReport2 报表设计器 在线表格
- 图像匹配之归一化积相关灰度匹配
- DevOps管道中的测试
- 基于区块链的数字藏品管控方案
- 人生七年,耗时56年跟拍14个孩子,结局道尽人生残酷真相
- 共线方程求解外方位元素--单片空间后方交会
- android email分析,QQ邮箱Android客户端产品体验报告
热门文章
- tomcat:日志配置详解(避免日志过多撑爆磁盘)
- vue学习之监听浏览器宽度
- 指挥系统核心服务器,应急指挥中心指挥调度系统解决方案(一)
- 智慧林草信息化解决方案(森林防火应急指挥系统)
- Gif 录制工具:Screen2Gif
- 为什么Lottie动画无法使用AVVideoCompositionCoreAnimationTool导出
- cad2020打印样式放在哪个文件夹_老师傅不会告诉你的CAD打印设置技巧
- libmodbus在ARM linux开发板上使用
- SRCNN 图像超分辨率重建(tf2)
- win10的计算机策略组,Win10家庭版如何添加组策略功能?