补码一位乘法

为什么要使用补码乘法?

在计算机中,使用一般乘法的话,对符号位还要重新进行异或操作,这样会大大降低运算速度,而使用补码乘法运算,就可以找到一种通用的解法来解决符号位的重复计算,而将符号位作为数字一起带入运算器进行计算

补码一位乘法规则

首先说明一下,为了便于证明,下面的证明都是在小数的基础上进行的,小数证明以后便可以直接推广整数

假设被乘数为[x]补[x]_补[x]补​
[x]补=x0x1x2x3...xn[x]_补=x_0x_1x_2x_3...x_n [x]补​=x0​x1​x2​x3​...xn​
乘数为[y]补[y]_补[y]补​
[y]补=y0y1y2y3...yn[y]_补=y_0y_1y_2y_3...y_n [y]补​=y0​y1​y2​y3​...yn​

两者均为任意的符号位,则有补码乘法公式:
[x∗y]补=[x]补∗y[x*y]_补=[x]_补*y\\ [x∗y]补​=[x]补​∗y
而由补码与其真值的关系:
[y]补=2+y(mod2)y=−y0+∑i=1nyi2−i[y]_补=2+y\ \ (mod\ \ 2)\\ y=-y_0+\sum_{i=1}^ny_i2^{-i} [y]补​=2+y  (mod  2)y=−y0​+i=1∑n​yi​2−i
(这个还是比较好证明的,对于正数,前面+2直接溢出了,所以还是等于y,而对于负数,第一次+1相当于是进行了一次模1运算,使其数值位跟补码一致,第二次+1相当于纠正了符号位为负数)

我们可以得到:
[x∗y]补=[x]补∗(−y0+∑i=1nyi2−i)[x*y]_补=[x]_补*(-y_0+\sum_{i=1}^ny_i2^{-i})\\ [x∗y]补​=[x]补​∗(−y0​+i=1∑n​yi​2−i)
在此我们可以对以上的补码乘法公式进行证明
[x]补=x0x1x2...xn=(2x0+x)mod2=(2n+1x0+x)mod2[y]补=0y1y2...yn=y∴[x]补∗y=(2n+1x0+x)y=2n+1x0y+xy∵y=(−y0+∑i=1nyi2−i)∴[x]补∗y=(−2n+1x0y0+2x0∑i=1nyi2n−i)+xy(mod2)=2+xy(mod2)【这里要根据模2性质进行推导】=[xy]补\begin{aligned} &\ \ \ [x]_补=x_0x_1x_2...x_n=(2x_0+x)\ \ mod\ \ 2=(2^{n+1}x_0+x)\ \ mod\ \ 2\\ &\ \ \ [y]_补=0y_1y_2...y_n=y\\ \therefore&\ \ \ [x]_补*y=(2^{n+1}x_0+x)y=2^{n+1}x_0y+xy\\ \because&\ \ \ y=(-y_0+\sum_{i=1}^ny_i2^{-i})\\ \therefore&\ \ \ [x]_补*y=(-2^{n+1}x_0y_0+2x_0\sum_{i=1}^ny_i2^{n-i})+xy\ \ (mod\ \ 2)\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =2+xy \ \ \ (mod\ \ 2)【这里要根据模2性质进行推导】\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =[xy]_补 \end{aligned} ∴∵∴​   [x]补​=x0​x1​x2​...xn​=(2x0​+x)  mod  2=(2n+1x0​+x)  mod  2   [y]补​=0y1​y2​...yn​=y   [x]补​∗y=(2n+1x0​+x)y=2n+1x0​y+xy   y=(−y0​+i=1∑n​yi​2−i)   [x]补​∗y=(−2n+1x0​y0​+2x0​i=1∑n​yi​2n−i)+xy  (mod  2)                =2+xy   (mod  2)【这里要根据模2性质进行推导】                =[xy]补​​
其实由上面的共识我们可以很容易得到公式:
[xy]补=[x]补(0y1y2...yn)−[x]补∗y0[xy]_补=[x]_补(0y_1y_2...y_n)-[x]_补*y_0 [xy]补​=[x]补​(0y1​y2​...yn​)−[x]补​∗y0​
使用这样的公式来求补码乘法,我们称之为校正法

对了,记住在使用校正法时应该是使用算数右移,即移动的时候ACC寄存器中补位的数应该跟ACC寄存器中的第一位一致

为什么要用Booth算法?

在一般的补码乘法中,我们进行加法运算的次数和加法中1的个数存在直接关系,而对于乘数中1比较多的情况,如果还是采用一般的补码乘法运算显然就比较低效,因此我们使用的Booth算法,这样只有在前后两位产生01的变化时才需要进行加法(或者减法,但是计算机中的减法其实就是加法,所以不用细究)运算。这样就可以大大提高运算效率了

Booth算法规则

第一,我们需要知道补码的运算规律是使用n轮加法与移位,最后在多进行一次加法,关于为什么要多一次加法,如果大家使用乘法分配律来理解就很容易知道了,因为最后一定会加一个数,不要问为什么,只要理解了乘法分配律就知道了

其次,补码一位乘法中,每次加法加的可能是0、[x]补、[−x]补0、[x]_补、[-x]_补0、[x]补​、[−x]补​,这又与原码移位算法不一样了

还有,对于补码一位乘法,每次移位只能是算数移位,也就是在前面补位时,补的位和符号位一样(只有第一位才是符号位嗷)

最最最关键的一点,在补码一位运算中,符号位也会参与运算!!!

符号位参与运算❓

大家一定会疑惑,为什么符号位也能参与运算?

原因很简单,在补码中,符号位并不是真的没有意义的,因为我们会发现,在真值跟补码的关系中,我们是可以找到一种方式将他们联系起来的

补码只对负数存在特别之处,但是对于正数跟原码是没有区别的,我们会发现,比如-1,他的补码其实就是111111111111111111111111

当我们对他进行+1操作以后,它就会变成100000000,但是由于最大表示位只有八位(在例子中),所以最后的结果会默认变成00000000也就是0

所以说,我们可以认为对于负数t来说,补码就是2n+t2^n+t2n+t的二进制位(要去掉超出的位数,n为最大位数),而我们会发现,对于0和正数来说,这个规律同样适用

所以我们会发现,这个所谓的符号位其实也可以当作数来计算,但是它同样担负着确认正负的重要职责,所以在转化的时候,我们只会将符号位转化为正负,而不会转化成数值

但是我们在计算过程中其实可以将它当作数值来看待,反正超出的位对我们没有什么影响(电路自动进行模运算)


运算法则

首先,在运算过程中,我们在MQ中会多使用一位来作为辅助位,以决定我们当前这一步到底进行加法还是减法运算,也因为MQ多了一位,所以其他寄存器也要跟着多添加一位

运算法则如上图,其实翻译过来就是,算上辅助位,

当在MQ寄存器中最后两位是01时就进行加x的补码,再进行右移位

当是10时就进行减x的补码的操作,也就是加[−x]补[-x]_补[−x]补​的操作,再进行右移位

其余的时候只要直接进行右移位就行了

WHY?

这里我不确保我能讲的明白,其实理解上就是一种乘法分配律,如果看不懂的可以看这篇博客

对于任意一个数,我们在小学的时候经常会学习使用一种办法化繁为简,比如计算9∗999*999∗99时,我们会将其拆分成9∗(100−1)9*(100-1)9∗(100−1)

这里我们其实用的是一个道理,比如对于010111110,我们可以拆分成(100000000-01000000+001000000-000000010)

这样我们就可以使用更少的加法来简化运算了,可以观察到,本来我们要使用6次加法运算,现在我们只需要使用4次加法运算即可(计算机中减法也是通过加法完成的)

这里其实在数学上也是存在证明的,对于一个数A来说,我们可以写成下面的形式:
A=−xn−1∗2n−1+xn−2∗2n−2+...+x0∗20=−xn−1∗2n−1+xn−2∗(2n−1−2n−2)+...+x0∗(21−20)=2n−1∗(xn−2−xn−1)+2n−2∗(xn−3−xn−2)+21(x0−x1)+20(0−x0)这里我们不妨虚构出一个x−1=0,以便得到通用结论∴原式=∑i=1n2i−1∗(xi−2−xi−1)\begin{aligned} A&=-x_{n-1}*2^{n-1}+x_{n-2}*2^{n-2}+...+x_0*2^0\\ &=-x_{n-1}*2^{n-1}+x_{n-2}*(2^{n-1}-2^{n-2})+...+x_0*(2^1-2^0)\\ &=2^{n-1}*(x_{n-2}-x_{n-1})+2^{n-2}*(x_{n-3}-x_{n-2})+2^1(x_0-x_1)+2^0(0-x_0)\\ 这&里我们不妨虚构出一个x_{-1}=0,以便得到通用结论\\ \therefore原式&=\sum_{i=1}^n2^{i-1}*(x_{i-2}-x_{i-1}) \end{aligned} A这∴原式​=−xn−1​∗2n−1+xn−2​∗2n−2+...+x0​∗20=−xn−1​∗2n−1+xn−2​∗(2n−1−2n−2)+...+x0​∗(21−20)=2n−1∗(xn−2​−xn−1​)+2n−2∗(xn−3​−xn−2​)+21(x0​−x1​)+20(0−x0​)里我们不妨虚构出一个x−1​=0,以便得到通用结论=i=1∑n​2i−1∗(xi−2​−xi−1​)​
由此我们得证上面式子的正确性

于是我们便可以直接使用上面的结论进行Booth算法的计算,这里我直接饮用了王道的ppt,大家可以试着自己算一下

如果说实在想不起来Booth算法的规则,我们也可以使用化繁为简的方法

补码一位乘法-一般乘法与Booth的证明与原理相关推荐

  1. [计算机组成原理] Booth算法 —— 补码一位乘法

    x * y = z 运算规则: 1.和原码一位乘法不同,补码一位乘法的符号位是参加运算的,且运算结果和所有参加运算的数都是补码形式. 2.乘数 x 取双符号位参与运算,部分积的初始值为0: 乘数 y ...

  2. 【计算机组成原理】定点乘法运算之补码一位乘法(Booth算法)

    x * y = z 讨论已知x和y的情况下,怎么通过补码一位乘法方法得出z- 首先说下运算规则- 和原码一位乘法不同的是,补码一位乘法的符号位是参加运算的~运算的所有的数包括得到的结果z都是补码的形式 ...

  3. 补码一位乘法(Booth算法)

    在补码一位乘法的求解过程中我们需要的东西:[X]补,[Y]补以及被乘数的相反数的补码[-X]补 一.运算规则 1.符号位参与计算 2.采用补码进行计算 3.被乘数X 一般取双符号位参与计算,并且让部分 ...

  4. (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)

    文章目录 一:乘法运算基本思想 二:原码一位乘法 (1)实现原理 (2)手算模拟 三:补码一位乘法( B o o t h Booth Booth

  5. 一位原码的乘法规则_原码一位乘法与补码一位乘法

    原码1位乘法 在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到.而乘积的数值部分则是两个正数相乘之积.设n位被乘数和乘数用定点小数表示(定点整数也相同适用) 被 ...

  6. 计算机组成原理:原码、补码一位乘,Booth算法

    原码一位乘: 学习传送门:原码一位乘 主要方法:1判断,2加法,3右移,循环结束 其他: 原码逻辑右移,原码高位补零 补码算数移位 补码一位乘: 学习传送门:补码一位乘 主要思想: 1判断 2加法 3 ...

  7. 分治算法经典问题---大整数乘法(1~32位大整数乘法)C++

    大整数乘法 大整数乘法(1~32位大整数乘法) 分治的思想 实验题目及要求(大整数乘法) 算法分析(result=m4*10^2^+(m2+m3)*10^n/2^+m1) 算法分析 代码 源文件 ma ...

  8. 位运算模拟乘法,模指数运算

    1. 整数乘法(位运算) 使用位运算模拟乘法,其遵照以下的数学原理,即: ab=a(b020+b121+⋅⋅⋅+bn−12n−1)=a(b020)+a(b121)+⋅⋅⋅+a(bn−12n−1)ab= ...

  9. 补码一位乘--布斯公式

    ◆ 先考查两个补码乘法运算的例子 例1: 已知 X=0.1011,Y=0.0001(真值) [X]补=01011 , [Y]补= 00001 [X*Y]补=000001011 [X]补*[Y]补=00 ...

最新文章

  1. pfSense book之2.4安装指南
  2. java连接符_使用java流将两个集合的元素与分隔符连接起来
  3. hibernate多对多映射关系实现
  4. IDA远程调试Android中so文件
  5. 二维码QR码的“疯狂”广告
  6. JavaScript中charCodeAt函数
  7. LOJ2360「NOIP2016」换教室
  8. docker本地仓库(本地镜像仓库)环境搭建
  9. 单片机c语言实习报告,单片机实习心得
  10. JanusGraph 创建索引步骤
  11. k2-fsa differentiable Finite State Acceptor(Dan 的 toturial总结)
  12. 迅雷x下载的东西都变成php格式化,关于文件下载后变成PHP格式的解决办法
  13. Android:圆形头像
  14. Andrej Karpathy读博建议和写论文的方法
  15. 达梦数据库 find_in_set 函数适配
  16. 世界的下一个主宰——人工智能
  17. Qt编写输入法V2018超级终结版
  18. TD-SCDMA和2G互操作实现指导手册
  19. 不喝咖啡,不喝茶。(图)
  20. Qt版双人俄罗斯方块游戏

热门文章

  1. Day 05- Vue3 Vue2响应式原理
  2. 【mysql】You must reset your password using ALTER USER statement before executing this statement报错处理
  3. Win7运行程序时弹出“windows防火墙安全警报“的解决方法
  4. ACL 2022事件相关(事件抽取、事件关系抽取、事件预测等)论文汇总
  5. win10无线显示未连接到服务器,Win10系统无线网络适配器显示未连接的解决方法...
  6. 我国构建物联网基础安全标准体系的时间表确定
  7. 机器学习和深度学习综述
  8. ValueError('need at least one array to stack') ValueError: need at least one array to stac
  9. 桂林游记(一):兴坪
  10. IT人的学习方法论-2,讨论学习的误区