这篇文章给大家聊聊关于补码乘法运算规则,以及整数补码的乘法运算法则对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
booth算法的步骤和规则
具体步骤如下:
1、被乘数X与乘数Y均以补码的形式参加乘法运算,运算结果是积的补码[5]。
2、部分积和被乘数X采用双符号位,乘数Y采用单符号位[5]。
3、初始部分积为0。运算前,在乘数Y的补码末位添加一位附加位Yn+1,初始值为0[5][6]。
4、根据YnYn+1的值,按照上表进行累加右移操作,右移时遵循补码的移位规则[5]。
5、累加n+1次,右移n次,最后一次不右移[5]。
乘法电路原理
主流的数字乘法器是Booth乘法器,网上有Booth乘法器的HDL电路描述代码,你可以去看看它的原理。
简单来说就是模拟笔算中乘数和被乘数分别为(0,0)、(0,1)、(1,0)、(1,1)这四种情况下运算出来的中间值和规律,然后按照乘数的位置进行一定次数的左移位操作,最后汇总相加。
现代CPU为了优化,还会引入LUT查找表,也就是事先把8bit以内所有乘数可能的情况(2^8=256)计算出来然后存储在CPU内部的一个特殊的ROM里面,要计算的时候直接查找指定位置上的值是多少,那结果就是多少。
这个查找表如果足够大的情况下,计算8bit或者16bit以内的乘法可能只需要一个周期,因为本质上就是LUT查表,LUT表通常非常小所以寻址和访问速度极快,才能实现单周期乘法。
还有一种思路是根据FPGA的LogicElement规格,厂商根据不同芯片器件制定对应的“成本模型”,并且针对不同的乘数,使用不同的综合方案。
例如在数字电路中如果需要计算n*6,FPGA综合器会根据目标器件的成本模型选择综合成n<<2+n+n这种逻辑单元或者n<<2+n<<1甚至更多方案,至于选择哪种方案,就会根据成本模型来决定,也就是计算到底是<<(左移位)更加节省LogicElement还是-(减法,也就是补码加法)更加节省LogicElement来选择综合方案,而通常都是shifter比adder的电路面积会更小,所以后者方案应用更多。
机器中为什么要用补码有什么好处
为了便于硬件逻辑电路的实现,高电平表示1,低电平表示0计算机中的数值用机器数来表示及运算,而这个数本身称作真值。机器数包括:原码、反码、补码、…….机器数用补码表示的好处:原码简单,适用于乘除运算,但用原码表示的数进行加减法运算比较复杂。补码,减法运算可以用加法来实现,例如[X-Y]补=[X]补+[-Y]补,且数的符号位也可以当作数值一样参与运算,便于运算结果的正负及是否溢出判断。因此在计算机中采用补码来进行加减及乘除运算。
补码都是有符号数吗有没有无符号数补码的
补码本质是用来构成一个环,以实现一个同余运算。
你可以认为所有定位长的加减乘除都是处于同余系情况下的:以32位整数为例,你取得的结果永远是2^32次方的余数,这与有无符号无关。
你叫加法器算一个1+2,然而加法器其实做的是个同余加法,即这样的作用是无论有符号还是无符号的运算,都可以共用同样的加法器(乘法器)。
然后我们知道,4294967296的余数总共就4294967296种,分别是0~4294967295。但是我们希望表示一个负数,那怎么做呢?于是乎就用4294967295来表示了。考虑到取值范围,以及为了方便区分,我们定义有一半的数是正数、一半的数是负数,恰恰就是二进制最高位为1则是负数,最高位为0则表示正数范围,这个就是补码的本质。至于补码的计算方法,也就是取反加1,完全是因为:这与『符号位』无关,它的逆运算,其实求解的是所以说到底还是个同余数论的问题。
所以你看,把x=0代入刚刚的同余方程,完全成立。
x补码与y补码乘积运算
X的补码为0.1010,-X的补码为1.0110,Y的补码为1.1001(低位有4位)。
高位低位(乘数补码处理值)说明
000000|110010最低位10,高位加-X的补码
110110
————
110110
11101101|1001执行右移,最低位01,高位加X的补码
001010
————
000101
00001010|1100执行右移,最低位00,高位加0
000000
————
000010
000001010|110执行右移,最低位10,高位加-X的补码
110110
————
110111
1110111010|11执行右移,乘数补码被右移出去,进行最后一次
000000运算,最低位11,高位加0
————
1110111010|11
最终结果为11.10111010,因为补码一位乘结果用的是双符号位,换成单符号位就是1.10111010。
我总结了点补码一位乘的方法,给你参考下
处理对象:被乘数补码*乘数补码=两数积的补码。
预处理:1、单独算出被乘数的相反数的补码,同时乘数补码往右扩一位补0(乘数补码处
理值),积的符号位与其余位必须一同计算。
2、两数补码相乘拆分为多个加法运算。
3、每次加法运算分为高位和低位两部分处理,高位初始值为0、位数是在带符号被乘
数位数基础上向左扩一位(利于右移),低位初始值是乘数补码处理值、位数与乘数
数据位位数相同。
第一次加:4、第一次加法是由高位和加数相加,加数的值由乘数补码处理值的最低两位确定
(若为01,加数为被乘数补码,若为10,加数为被乘数的相反数的补码,若这两位
的数值相等,则加数为0;加数左边多余的一位根据其符号位确定补0还是补1,符
号位为0则补0,符号位为1则补1)。
5、此次加法运算结束后,加法运算所得的高位(部分积)与低位合成一个整体并右移1
位得到新的高位和低位(右移时左边补0还是补1由右移前的符号位确定,符号位为
0则补0,符号位为1则补1,,另外在右移时乘数补码处理值也连带着右移)。
第二次加:6、高位再次进行加法处理,加数的值由新得到的乘数补码处理值的最低两位确定(确
定方法同第4点)。
7、此次加法运算结束后,加法运算所得的高位(部分积)与低位合成一个整体并右移1
位得到新的高位和低位(右移时高位左边补0或1的确定方法同第5点,另外在右移
时乘数补码处理值也连带着右移)。
循环加法:8、按“第二次加”的方法循环,直至低位将乘数补码处理值的每一位都右移出去后,
再进行一次加法运算(此次加法运算结束后不进行右移),此时得到的高位和低位
合成一个整体就是最终乘积,这个最终乘积是双符号位。
9、所得的最终乘积的小数位数必须是被乘数补码与乘数补码的小数位数之和。
关于双符号位:00正,11负,01上溢,10下溢。
附注:无论是原码一位乘,还是补码一位乘、补码二位乘,与手工算法都有共通之处,都是根据
乘数每一位(或两位)的状态在被乘数的基础上来确定加数(如被乘数、被乘数补码、被
乘数相反数补码、0),因为乘数是二进制的,每一位只有0、1两种状态,所以又免去
了手算十进制乘法中以乘数每一位去乘被乘数来确定加数的过程,而右移所得的部分
积就相当于手算乘法中左移加数。
觉得有用点个赞吧
补码原码反码有必要学吗
有必要学,
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码,都是没有任何用处的。
补码的功能,类似于:
时针,倒拨3小时,可以用正拨9小时代替。
利用这种思路,计算机中的负数,也可以用正数(即补码)代替。
于是,计算机中,就没有负数了。
同时,减法运算,也都不存在了。
因此,借助于补码,就能统一加减法,从而简化计算机的硬件。
这就是使用补码的原因。
关于补码乘法运算规则的内容到此结束,希望对大家有所帮助。