补码一位乘(布斯公式)
转自:http://ep02.blog.163.com/blog/static/67655853200821842019254/
本文适用于补码表示的定点小数或定点整数乘法运算(硬件或软件实现)
◆ 先考查两个补码乘法运算的例子
例1: 已知 X=0.1011,Y=0.0001(真值)
[X]补=01011 , [Y]补= 00001
[X*Y]补=000001011
[X]补*[Y]补=000001011
这时有,[X*Y]补=[X]补*[Y]补
例2: 已知 X=0.1011,Y= - 0.0001(真值)
[X]补=01011 , [Y]补= 11111
[X*Y]补=111110101
[X]补*[Y]补=101010101
显然,[X*Y]补 ≠ [X]补*[Y]补
▲ 对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。
原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以纯小数为例)
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 - 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 = ?
[解:] 求解过程如下:
部分积 |
乘数 |
说明 |
|||||||||
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
实现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,黑体字表示对两个判断位的判断。
用Booth补码一位乘法计算2 ×(-3)的过程
|
转载于:https://www.cnblogs.com/xisheng/p/9260861.html
补码一位乘(布斯公式)相关推荐
- 补码一位乘--布斯公式
◆ 先考查两个补码乘法运算的例子 例1: 已知 X=0.1011,Y=0.0001(真值) [X]补=01011 , [Y]补= 00001 [X*Y]补=000001011 [X]补*[Y]补=00 ...
- 补码一位乘法——布斯(Booth)算法
布斯Booth算法 "乘积"均改为"部分积".
- 原码一位乘、补码一位乘(校正法、布斯法)、补码两位乘
学习笔记 一.原码一位乘·: 运算法则:若Yi=1,+X; 若Yi=0,+0.(n次加法,n次移位) 二.补码一位乘(符号位参与运算) 校正法 若Y>0,计算方法与原码一位乘类似: 若Y< ...
- 一位原码的乘法规则_原码一位乘法与补码一位乘法
原码1位乘法 在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到.而乘积的数值部分则是两个正数相乘之积.设n位被乘数和乘数用定点小数表示(定点整数也相同适用) 被 ...
- 补码一位乘法-一般乘法与Booth的证明与原理
补码一位乘法 为什么要使用补码乘法? 在计算机中,使用一般乘法的话,对符号位还要重新进行异或操作,这样会大大降低运算速度,而使用补码乘法运算,就可以找到一种通用的解法来解决符号位的重复计算,而将符号位 ...
- [计算机组成原理] Booth算法 —— 补码一位乘法
x * y = z 运算规则: 1.和原码一位乘法不同,补码一位乘法的符号位是参加运算的,且运算结果和所有参加运算的数都是补码形式. 2.乘数 x 取双符号位参与运算,部分积的初始值为0: 乘数 y ...
- (计算机组成原理)第二章数据的表示和运算-第二节6:定点数除法运算(原码/补码一位除法)
文章目录 一:除法运算基本思想 二:原码一位除法:恢复余数法 (1)实现原理 (2)手算模拟 三:原码一位除法:加减交替法(不恢复余数法) 四:补码一位除法 五:总结 一:除法运算基本思想 关于定点数 ...
- (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
文章目录 一:乘法运算基本思想 二:原码一位乘法 (1)实现原理 (2)手算模拟 三:补码一位乘法( B o o t h Booth Booth
- 【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)
x * y = z 讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z- 首先说下运算规则- 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都是补码的形式 ...
最新文章
- ROS Hotspot服务器的搭建与设定!(上网认证)
- 顺序查找(c/c++)
- Qt动画框架Animation Framework
- 马匹赛跑java_java模拟龟兔赛跑
- vue之神奇的动态按钮
- idea全局主题_IntelliJ IDEA好看的主题设置(支持自定义)
- Linux系统中的用户管理
- Waterfall Header Bidding机制
- 手机连接笔记本开启的WiFi一直显示正在获取IP中
- 英语中的逻辑思维真奇妙
- Fuchsia源码分析--系统调用流程
- 公众号文章怎么制作?
- 苹果手机如何找回id密码_iPhone手机ID总是忘记密码,轻松一招帮你找回,原来这么简单...
- (一)DragonBone制作运动的小汽车
- live2d sdk java_Unity Live2D SDK的使用方法(一)——载入资源
- 菜狗杯Misc抽象画wp
- Openwrt实现双4G模块拨号
- 麦当劳点餐系统———————新手勿喷
- 【Java编程学习】案例8-4 模拟12306售票
- 言语理解与表达之逻辑填空
热门文章
- 关于大学生课余时间分配利用的调查报告
- C#工业触摸屏上位机源码 替代传统plc搭载的触摸屏
- 股票、期货、期权的差异
- 计算机软件和应用审稿可以加急吗,计算机类期刊审稿周期
- 书单|互联网企业面试案头书之程序员软技能篇
- 惩罚因子(penalty term)与损失函数(loss function)
- vue3 编译报 ESLint: ‘defineProps‘ is not defined no-undef 错误问题
- 差分进化算法python 指派问题_多目标优化算法
- Openharmony应用NAPI详解--进阶篇1
- 温控中使用PID控制算法