补码一位乘法之较正法的公式推导
补码一位乘法校正法

补码一位乘法校正法补码一位乘法校正法是一种用于检测和纠正乘法器误差的方法。
在数字电路中,乘法器是一种非常重要的组件,负责执行数字信号的乘法运算。
然而,由于硬件设计和制造的不完美,乘法器可能会产生误差,导致输出结果不准确。
补码一位乘法校正法就是一种常用的解决方案。
在理解补码一位乘法校正法之前,我们首先需要了解补码的概念。
补码是一种用于表示有符号整数的编码方式。
在计算机中,负数一般使用补码表示,这样可以简化运算。
补码的计算方法是将原码的符号位保持不变,其余位按位取反后加1。
例如,-5的原码为10000101,补码为11111011。
补码一位乘法校正法的基本思想是将乘法器的输出结果与真实的乘法结果进行比较,并根据比较结果来调整乘法器的输出。
具体步骤如下:1. 乘法器的输入为两个n位的补码数字,输出为一个2n位的补码数字。
2. 将乘法器的输出结果与真实的乘法结果进行比较。
如果两者相等,则乘法器的输出是正确的;如果不相等,则说明乘法器存在误差。
3. 根据乘法器输出的最高位进行判断。
如果最高位为1,说明乘法器的输出是负数,需要对乘法器的输出进行补码取反操作;如果最高位为0,则不需要进行操作。
4. 将乘法器的输出与校正后的结果进行比较。
如果两者相等,则乘法器的输出是正确的;如果不相等,则说明乘法器的误差无法通过补码一位乘法校正法进行修复。
补码一位乘法校正法的原理是通过对乘法器输出结果的最高位进行判断,来确定是否需要对乘法器的输出进行补码取反操作。
通过这种方法,可以有效地检测和纠正乘法器误差,提高乘法器的准确性和可靠性。
然而,补码一位乘法校正法只能处理一位乘法误差,对于多位乘法误差无法进行有效的修复。
在实际应用中,补码一位乘法校正法通常与其他纠错技术结合使用,以进一步提高乘法器的准确性。
例如,可以将补码一位乘法校正法与冗余校验码相结合,通过对乘法器输出结果进行校验和校正,来实现更可靠的乘法运算。
总结起来,补码一位乘法校正法是一种用于检测和纠正乘法器误差的方法。
二进制补码一位乘法规律的推导

二进制补码一位乘法规律的推导作者:孙启良来源:《电脑知识与技术》2009年第25期摘要:计算机采用补码运算,速度快效率高,但其递推公式推导复杂。
补码乘法也是《计算机组成原理》课程的难点。
文章从补码与真值的关系出发,首先推导出补码的右移公式,最终给出了二进制补码一位乘法规则的较全面的推导过程。
关键词:机器数;真值;补码;补码阵列乘法器中图分类号:TP332文献标识码:A文章编号:1009-3044(2009)25-7278-03A Detailed Derivation of the Rules about Two's Complement MultiplicationSUN Qi-liang(University of Ji'nan, Ji'nan 250022, China)Abstract: The computer using two's complement is faster and more efficient,but the derivation of the rules about two's complement multiplication is Complex.Two's complement multiplication is also a difficulty of the course "Principles of Computer Organization".This article starts from the relations of two's complement and the true value.First,it deduces a formula about the shifting to right of two's complement.Finally,it gives the detailed rules about two's complement multiplication.Key words: machine number; true value; two's complement; two's complement array multiplier在计算机中表示的带符号的二进制数称为“机器数”。
原码补码乘除法

原码一位乘运算
例如: X = 0.1101
[X]原= 0.1101 X* = 0.1101
Y = - 0.1011
[Y]原 = 1.1011 Y* = 0.1011
0. 1 1 0 1 × 0. 1 0 1 1
1101 1101 0000 + 1101 0.10001111 手工运算过程
原码一位乘运算
返回
以定点小数为例
例如: X = 0.1101 Y = - 0.1011
X × Y = - 0.10001111
0. 1 1 0 1 × 0. 1 0 1 1 0. 0 0 0 0 1 1 0 1
机器实现问题: 1. 加法器只有两个数据输入端; 2. 加法器与运算数据位数相同。
0. 0 0 0 1 1 0 1 0. 0 0 0 0 0 0 +0. 0 1 1 0 1 0.10001111
0. 0000 累加器初值取零值 + 0. 1101
0. 1101 初值0加被乘数 0. 01101 部分积右移,
将移出的一位保存起来 求第一次部分积
原码一位乘运算
返回
X* = 0.1101
Y* = 0.1011
0. 1 1 0 1 × 0. 1 0 1 1
1101 1101 0000 + 1101 0.10001111
部分积 0. 0 0 0 0 + 0. 1 1 0 1 0. 1 1 0 1 0. 0 1 1 0 + 0. 1 1 0 1 1. 0 0 1 1 0. 1 0 0 1 0. 0 1 0 0 + 0. 1 1 0 1 1. 0 0 0 1 0. 1 0 0 0
《补码一位乘法》课件

01
02
03
数字滤波器设计
在数字信号处理中,补码 一位乘法可以用于设计数 字滤波器,实现信号的滤 波和频谱分析。
频域分析
通过补码一位乘法,可以 对信号进行快速傅里叶变 换(FFT),实现信号的 频域分析。
调制解调
在通信系统中,补码一位 乘法可以用于调制解调过 程,实现信号的调制和解 调。
在其他领域的应用
。
最后得到的和即为乘积,再根据需要转 换为十进制或其他进制形式。
补码一位乘法的应用场景
补码一位乘法在计算机科学和电子工 程领域有广泛的应用。
在软件中,补码一位乘法用于各种算 法和数据处理中,如科学计算、图像 处理、音频处理等。
在计算机硬件中,补码一位乘法用于 实现高效的乘法运算,特别是在二进 制数的算术逻辑单元(ALU)中。
控制系统
在控制系统中,补码一位 乘法可以用于实现控制算 法,如PID控制器等。
图像处理
在图像处理中,补码一位 乘法可以用于实现图像的 缩放、旋转等几何变换。
数值分析
在数值分析中,补码一位 乘法可以用于实现各种数 学运算,如矩阵乘法、多 项式求值等。
THANKS
感谢观看
02
CATALOGUE
补码一位乘法运算过程
符号位参与运算
符号位参与乘法运算
在补码一位乘法中,符号位也参与运算,正数的符号位为0,负数的符号位为1 。
正负符号位运算规则
正数与正数相乘,符号位为0;正数与负数相乘,符号位为1;负数与负数相乘 ,符号位为0。
乘数与被乘数相乘
相乘过程
将乘数和被乘数的每一位相乘, 得到相应的积,并将积的符号位 与原符号位相同。
补码一位乘法与原码一位乘法的优缺点比较
定点补码一位乘的运算方法

定点补码一位乘的运算方法定点补码一位乘的运算方法:按乘数为正、负两种情况讨论:1.被乘数[x]补符号任意,乘数[y]补为正设[x]补=x0.x1x2…x n[y]补=y0.y1y2…y n根据补码定义可推得: [x]补=2+x=2n+1+x (MOD2)[y]补=y=0.y1y2...y n其中x,y为真值.故: [x]补[y]补=(2n+1+x)*y=2n+1+xy=21*2n(0.y1y2...y n)+xy=2(y1y2...y n)+xy注意0.y1y2...y n被2n乘已成为正整数.根据模的运算性质有:2(y1y2...y n)=2 (mod 2)所以 [x]p*[y]p=2+x*y=[x*y]补(mod 2)即 [x*y]p=[x]p*[y]p=[x]p*y(因为y s=0为正) =[x]p* (0.y1y2...y n) (1) 当乘数y>0,不管x的符号如何,将[x]p*y=[x*y]p2.被乘数[x]p符号任意,乘数y为负[x]补=x0.x1x2…x n[y]补=1.y1y2…y n =2+y (mod 2)该项得: y=[y]补-2=1.y1y2…y n -2=1+0.y1y2...y n-2=0.y1y2...y n-1 所以 x*y=x*(0.y1y2...y n-1)=x*(0.y1y2...y n)-x将上式两边取补所以有: [x*y]p=[x(0.y1y2...y n)-x]p=[x(0.y1y2...y n)]p-[x]p=[ x(0.y1y2...y n)]p+ [-x]p因为 (0.y1y2...y n)>0 正数的补码 = 本身所以 [x(0.y1y2...y n)]p= [x]p*(0.y1y2...y n)所以 [x*y]p= [x]p*(0.y1y2...y n) -[x]p (2)将(1)和(2)综合起来:得统一的算式[x*y]p= [x]p*(0.y1y2...y n) -[x]p*y0 (3)=[x]p*(-y0+0.y1y2...y n)分析:右边第二项[x]p*y0当y为正 y0=0 该项不存在 (1)y为负 y0=1 该项为[x]p (2)将(3)式展开,推出逻辑实现分步算法:获得各项部分积的累加形式.[x*y]p= [x]p*(0.y1y2...y n) -[x]p*y0= [x]p*(2-1y1+2-2y2+…+2-n y n) -[x]p*y0=[x]p*[-y0+ (y1-2-1y1)+( y22-1-2-2y2)+…+(2-(n-1)y n-2-n y n) =[x]p*[(y1-y0)+(y2-y1)2-1+…+(y n-y n-1)2-(n-1)+(y n+1-y n) 2-n] 说明:(1) 0.y1y2...y n可写成2-1y1+2-2y2+…+2-n y n(2)提公因式[x]p将 -y0 提前(3)去括号重新组合(4) y1-2-1y1=(20-2-1)y1=(1-1/2) y1=0.5yy22-1-y22-2=(2-1-2-2)*y2=2-2y2[x*y]补= [x]补*(0.y1y2...y n) -[x]补*y0= [x]补*(2-1y1+2-2y2+…+2-n y n) -[x]补*y0=[x]补*[-y0+ (y1-2-1y1)+( y22-1-2-2y2)+…+(2-(n-1)y n-2-n y n)=[x]补*[(y1-y0)+(y2-y1)2-1+…+(y n-y n-1)2-(n-1)+(y n+1-y n) 2-n]将[x]p乘进去,然后从第2项开始,每次提2-1=(y1-y0)[x]p+(y2-y1)2-1[x]p+…+(y n+1-y n)2-n[x]p=(y1-y0)[x]p+2-1[(y2-y1)[x]p+(y3-y2)2-1[x]p+(y4-y3) 2-2[x]p…+(y n+1-y n) 2-(n-1) [x]p]1=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1[(y3-y2)[x]p+(y4-y3)2-1[x]p…+(y n+1-y n) 2-(n-2)[x]p]2}1=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1[(y4-y3)[x]p…+(y n+1-y n) 2-(n-3)[x]p]3}2}1…………………=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1{(y4-y3)[x]p…+2-1 {(y n-y n-1)[x]p +2-1 [(y n+1-y n)[x]pn]n}n-1…}3}2}1说明:式中y n+1是增设的附加位,初始值位0.a i取决于相邻两位乘数的比较结果显然(4)式就是部分积累加的形式若定义[p0]补位初始部分积=0. [p1]补……[p n]补依次位各步求得的累加并右移后的部分积.将(4)改写:更接近于分步运算逻辑实现[x*y]p=[x]p*[(y1-y0)+(y2-y1)2-1+…+(y n-y n-1)2-(n-1)+(y n+1-y n) 2-n]将[x]p乘进去,然后再次提2-1=(y1-y0)[x]p+(y2-y1)2-1[x]p+…+(y n+1-y n)2-n[x]p=(y1-y0)[x]p+2-1[(y2-y1)[x]p+(y3-y2)2-1[x]p+(y4-y3) 2-2[x]p…+(y n+1-y n) 2-(n-1) [x]p]1=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1[(y3-y2)[x]p+(y4-y3)2-1[x]p…+(y n+1-y n) 2-(n-2)[x]p]2}1=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1[(y4-y3)[x]p…+(y n+1-y n) 2-(n-3)[x]p]3}2}1…………………=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1{(y4-y3)[x]p…+2-1 {(y n-y n-1)[x]p +2-1 [(y n+1-y n)[x]pn]n}n-1…}3}2}1y>0 [x*y]p= [x]p*(0.y1y2...y n) (1)y<0 [x*y]p= [x]p*(0.y1y2...y n) -[x]p (2)统一算式: [x*y]p= [x]p*(0.y1y2...y n) -[x]p*y0 (3)=[x]p*(-y0+0.y1y2...y n)化简: =[x]p*[(y1-y0)+(y2-y1)2-1+…+(y n-y n-1)2-(n-1)+(y n+1-y n) 2-n] (4)将[x]p乘进去从第二项开始,每次提2-1 ==(y1-y0)[x]p+2-1[(y2-y1)[x]p+(y3-y2)2-1[x]p+(y4-y3)2-2[x]p…+(y n+1-y n) 2-(n-1) [x]p]1……………………=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1{(y4-y3)[x]p…+2-1{(y n-y n-1)[x]p +2-1 [(y n+1-y n)[x]pn]n}n-1…}3}2}1=(y1-y0)[x]p+2-1{(y2-y1)[x]p+2-1{(y3-y2)[x]p+2-1{(y4-y3)[x]p…+2-1{(y n+1-y n)[x]p +[[P0]补]n}n-1…}3}2}1[P1]补写成递推公式:[P0]补=0[P1]补=2-1{(y n+1-y n)[x]p +[[P0]补]n} 令y n+1=0[P2]补=2-1{(y n-y n-1)[x]p +[[P1]补]n}………………[P i]补=2-1{(y n-i+2-y n-i+1)[x]p +[[P i-1]补]n}………………[P n]补=2-1{(y2-y1)[x]p +[[P n-1]补]n}所以: [ x*y]补=[[P n+1]补]= (y1-y0)[x]p+[P n]补<4> 注意:(1)y0 是乘数y的符号位.y n+1是人为附加位 =0.使式子规范整齐.(2)开始运算时p0=0 , y n+1=0部分积※新部分积获得的方法:1、乘数相邻的两位求差。
定点补码一位乘法的实现算法 用[x]补×[y]补直接求[x×y]补
![定点补码一位乘法的实现算法 用[x]补×[y]补直接求[x×y]补](https://img.taocdn.com/s3/m/941c3a6daf1ffc4ffe47ac2f.png)
定点补码一位乘法的实现算法
用此法计算乘积,需要乘数寄存器的最低一位之后再补充一位 Yn+1,并使其初值为0,再增加对Yn和Yn+1两位进行译码的线路, 以区分出Yn+1-Yn 4种不同的差值。对N位的数(不含符号位) 相乘,要计算N+1次部分积,并且不对最后一次部分积执行右移 操作。此时的加法器最好采用双符号位方案。
定点补码一位除法的实现算法
运算规则如下: (1)如果被除数与除数同号,开始求商时,用被除数减去除数, 若二数异号,则用被除数加上除数的办法处理。 (2)若余数与除数同号,上商1,左移一位后下次用余数减除数操 作求商,若余数与除数异号,上商0,左移一位后下次用余数加除 数操作求商。 (3)商的符号,是在第一次求商试算时求出的,若定点除不溢出, 得到的就是正确的符号位的值。 (4)商的修正问题。在对精度要求不高时,将商的最低一位恒置1。 最大误差为|2-n|。 若对商的精度要求较高,可对N位数求商N+1次,按得到的不同结 果对商进行修正。当商为负数时,要在商的最低一位加1,从反码 的结果得到商的正确的补码值。
定点双位乘法的实现方案
阵列乘法器 跳0 跳1法 (1)如果R≥0,且R的高K个数位均为0,则本次直接得商1后 跟K-1个0,R左移K位后,减出除数D,得新余数。 (2)如果R<0,且R的高K个数位均为1,则本次直接得商0 后跟K-1个1,R左移K位后,加上除数D,得新余数。 用快速乘法器实现快速除法运算
定点补码一位乘法的实现算法
用[X]补×[Y]补直接求[X×Y]补 讨论当相乘的两个数中有一个或二个为负数的情况 在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘 法有某些类似,差别仅表现在被乘数和部分积的符号位要和数 值一起参加运算。 若[Y]补=Y0Y1Y2…Yn 当Y0为1时,则有
定点补码一位乘法的实现算法 用[x]补×[y]补直接求[x×y]补
![定点补码一位乘法的实现算法 用[x]补×[y]补直接求[x×y]补](https://img.taocdn.com/s3/m/941c3a6daf1ffc4ffe47ac2f.png)
原码一位除法的实现算法
计算机中常用原码的加减交替法完成除法运算,商的符号为相除二数符号 的异或值,数值则为二数的绝对值之商。 除法的算法有恢复余数法和不恢复余数法(加减交替法)二种。 原码一位除法实现方案小结: (1)对定点小数除法,首先要比较除数和被除数的绝对值的大小,防止出 现数值溢出的错误。 (2)商的符号为相除二数的半加和。 (3)在计算机中用加减交替法实现除法时,被除数的位数可以是除数的2 倍,其低位的数值部分,开始时放在用于保存商的寄存器中。运算过程中, 放被除数和商的寄存器同时左移位。 (4)在计算机中,求差和移位是在同一操作步骤中完成的,而不是用两个 步骤完成。
定点补码一位乘法的实现算法
用[X]补×[Y]补直接求[X×Y]补 讨论当相乘的两个数中有一个或二个为负数的情况 在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘 法有某些类似,差别仅表现在被乘数和部分积的符号位要和数 值一起参加运算。 若[Y]补=Y0Y1Y2…Yn 当Y0为1时,则有
n
Y=-1+ ∑ Yi×2-i 故有 X×Y=X× ∑ Yi×2-1-X
n
X×Y=X×(-1+
∑ Yi×2i)
i =1
(逐项展开则得)
=X×[-Y0+Y1×2-1+Y2×2-2+…+Yn×2-n] =X×[-Y0+(Y1-Y1×2-1)+(Y2×2-1-Y2×2-2)+…+(Yn×2-(n1)-Y ×2-n)] n (合并相同幂次项得)
定点补码一位乘法的实现算法
=X×[(Y1-Y0)+(Y2-Y1) ×2-1+…+(Yn-Yn-1) ×2-(n-1)+(0 -Yn) ×2-n]
定点补码一位除法的实现算法
运算规则如下: (1)如果被除数与除数同号,开始求商时,用被除数减去除数, 若二数异号,则用被除数加上除数的办法处理。 (2)若余数与除数同号,上商1,左移一位后下次用余数减除数操 作求商,若余数与除数异号,上商0,左移一位后下次用余数加除 数操作求商。 (3)商的符号,是在第一次求商试算时求出的,若定点除不溢出, 得到的就是正确的符号位的值。 (4)商的修正问题。在对精度要求不高时,将商的最低一位恒置1。 最大误差为|2-n|。 若对商的精度要求较高,可对N位数求商N+1次,按得到的不同结 果对商进行修正。当商为负数时,要在商的最低一位加1,从反码 的结果得到商的正确的补码值。
定点补码一位乘法的实现算法用x补y补直接求xy补

定点补码一位除法的实现算法
运算规则如下:
(1)如果被除数与除数同号,开始求商时,用被除数减去除数, 若二数异号,则用被除数加上除数的办法处理。
(2)若余数与除数同号,上商1,左移一位后下次用余数减除数操 作求商,若余数与除数异号,上商0,左移一位后下次用余数加除 数操作求商。
(3)商的符号,是在第一次求商试算时求出的,若定点除不溢出, 得到的就是正确的符号位的值。
(4)商的修正问题。在对精度要求不高时,将商的最低一位恒置1。 最大误差为|2-n|。
若对商的精度要求较高,可对N位数求商N+1次,按得到的不同结 果对商进行修正。当商为负数时,要在商的最低一位加1,从反码 的结果得到商的正确的补码值。
定点双位乘法的实现方案
阵列乘法器 跳0 跳1法 (1)如果R≥0,且R的高K个数位均为0,则本次直接得商1后 跟K-1个0,R左移K位后,减出除数D,得新余数。 (2)如果R<0,且R的高K个数位均为1,则本次直接得商0 后跟K-1个1,R左移K位后,加上除数D,得新余数。 用快速乘法器实现快速除法运算
故有 X×Y=X× Yi×2-1-X i 1
当Y为负值时,用补码乘计算[X×Y]补,是用[X]补乘上[Y]补的数 值位,而不理[Y]补符号位上的1,乘完之后,在所得的乘积中再 减X,即加- [X]补。
定点补码一位乘法的实现算法
实现补码乘法的另一个方案是比较法,是由BOOTH最早提出 的,这一方法的出发点是避免区分乘数符号的正负,而且让乘 数符号位也参加运算。技巧上表现在分解乘数的每一位上的1 为高一位的一个+1和本位上的一个-1:
定点补码一位乘法的实现算法
Pn=[2-1(Pn-1+(Y2-Y1) ×X)]补 Pn+1=[ (Pn+(Y1-Y0) ×X)]补 则最终补码乘积为[X*Y]补=[Pn+1]补 由上述公式可以看出,比较法是用乘数中每相邻的两位判断 如何求得每次的相加数。 每两位Yi和Yi+1的取值有00,01,10,11四种组合,则它们的 差值分别为0,1,-1和0,非最后一次的部分积,分别为上一 次 部 分 积 的 1/2 ( 右 移 一 位 ) 的 值 Rj , Rj + [X] 补 , Rj - [X] 补 (即Rj+[-X]补)和Rj,但一定要注意:最后一次求出的部 分积即为最终乘积,不执行右移操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在定点乘法运算中,补码乘法分为补码一位乘法和补码两位乘法。
而补码一位乘法又分为较正法和比较法(Booth算法)两种。
其中,较正法是比较法的基础。
因此,掌握较正法是学习补码一位乘法的关键。
下面,我们就对较正法进行深入分析。
一、较正法公式[XY]补= [X]补*(0.Y1,Y2, … ,Y n) + [-X]补*Y0其中,X、Y是两个定点数的真值,[Y]补=Y0.Y1,Y2, … ,Y n,Y0是符号位。
为了推导出此公式,我们分情况来进一步分析。
1、Y=0在这种情况下,[Y]补=Y=0.0,0, … ,0=0。
[XY]补=0=[X]补*(0.0,0, … ,0)+[-X]补*0=[X]补*(0.Y1,Y2, … ,Y n)+[-X]补*Y02、X>=0, Y>0在这种情况下,[X]补=X,[Y]补=Y,且Y0=0。
不难看出,[XY]补=XY=[X]补*Y=[X]补*(Y0.Y1,Y2, … ,Y n)+[-X]补*0=[X]补*(0.Y1,Y2, … ,Y n)+[-X]补*Y0到此为止,我们还有两种情况尚未讨论,一种情况是X<0, Y>0,一种情况是Y<0。
前一种情况是本文讨论的重点。
与很多教材上的推导方法不同,本文采用与原码一位乘法相对照来证明此种情况。
此方法用到的知识点有原码一位乘法和补码移位规则。
首先,我们先来回顾一下这两个知识点。
二、原码一位乘法原码一位乘法基本上是从手算法则演变过来的。
我们知道,两个数相乘的手算法则是“绝对值相乘;同号得正,异号得负”。
原码一位乘法也采用这种方法。
设[X]原=X s.X1,X2, … ,X n[Y]原=Y s.Y1,Y2, … ,Y n因为[X]原=X,[Y]原=Y,[XY]原=XY所以[XY]原=[X]原*[Y]原则P=|[XY]原|=|[X]原|*|[Y]原|符号位P s=X s⊕Y s下面,我们对P进一步分析。
设A=|[X]原|则P=|[X]原|*|[Y]原|=A*( 0.Y1,Y2, … ,Y n)=0.1{ Y1A+(0. Y2, … ,Y n)}=0.1{ Y1A +0.1{ Y2 A +(0.Y3, … , Y n)}}=0.1{ Y1A +0.1{ Y2 A + … +0.1{Y n (A+0)}…}}这样,我们就得到了原码一位乘法的公式:P=0.1{ Y1A +0.1{ Y2 A + … +0.1{Y n (A+0)}…}}P s=X s⊕Y s其中,P=|[XY]原|,P s为乘积的符号位,A=|[X]原|,[X]原=X s.X1,X2, … ,X n,[Y]原=Y s.Y1,Y2, … ,Y n,X s和Y s是符号位。
三、补码移位规则对于一个数的补码来说,左移一位相当于该数真值乘以2,右移一位相当于该数真值乘以1/2。
1、非负数补码移位规则:除符号位外剩余部分作相应移位后空位补0。
因为非负数补码与原码相同,所以其移位规则也相同,这很容易理解。
2、负数移位规则:除符号位外剩余部分作相应移位后,左移空位补0,右移补1。
因为补码一位乘法只涉及到补码右移,所以这里只给出负数补码右移规则证明。
证明如下:设[X]补=X0.X1,X2, … ,X n因为[X]补=2+X则X=[X]补-2=X0.X1,X2, … ,X n-2因为X为负数,所以X0=1,则X=-X0+0.X1,X2, … ,X n (注1)1/2X=-1/2 X0+1/2(0.X1,X2, … ,X n)=-X0+1/2 X0+1/2(0.X1,X2, … ,X n)=-X0+1/2(X0.X1,X2, … ,X n)=-X0+0.X0, X1,X2, … ,X n-1写成补码形式,即得[1/2X]补=X0.X0, X1,X2, … ,X n-1即[1/2X]补=0.1[X]补(0.1可以看成是右移一位操作)四、较正法公式(续)3、X<0, Y>0证法1:前面已经讲过,原码一位乘法的公式为P=0.1{ Y1A +0.1{ Y2 A + … +0.1{Y n (A+0)}…}}不难发现,这个式子里包含着一个递归操作,递归因子是R=0.1{Y m (A+Z)}所以,我们只需证明下面这个式子即可:0.1{Y m ([B]补+[Z]补)}=[ 0.1{Y m (B+Z)}]补证明如下:0.1{Y m ([B]补+[Z]补)}=0.1{Y m ([B+Z]补)}=0.1{[Y m (B+Z)]补} (Y m只有0、1这两种可能)=[ 0.1{Y m (B+Z)}]补(补码右移一位)这里需要注意一点,如果两个数相加得到的结果发生溢出,若结果向右移动一位,则原码空位补1,补码空位补0。
对上面式子的两端进行同等递归后可得[X]补*Y=[XY]补所以[XY]补= [X]补*(0.Y1,Y2, … ,Y n) + [-X]补*Y0证法2:[X]补*(0.Y1,Y2, … ,Y n) + [-X]补*Y0=[X]补*(0.Y1,Y2, … ,Y n)=0.1Y1[X]补+0.01Y2[X]补+ … +0.00 … 01Y n[X]补=[0.1Y1X]补+[0.01Y2X]补+ … +[0.00 … 01Y n X]补(0.00 … 01可以看成是右移n位操作)=[XY]补简单来说,因为补码和原码一样支持相加和右移操作,所以补码也支持非负乘操作。
4、Y<0前面已经证明X=-X0+0.X1,X2, … ,X n所以,当Y<0时,Y=0.Y1,Y2, … ,Y n-1XY=X(0.Y1,Y2, … ,Y n)-X[XY]补=[X(0.Y1,Y2, … ,Y n)-X]补=[X]补(0.Y1,Y2, … ,Y n)+[-X]补=[X]补*(0.Y1,Y2, … ,Y n) + [-X]补*Y0证毕。
五、常见证法存疑与解惑在证明X<0, Y>0的情况时,有些书上是这样证明的:因为[X]补=2+X=2n+1+X (mod 2)所以[X]补*[Y]补=[X]补*Y=(2+X)*Y (mod 2)=(2n+1+X)*Y (mod 2)=2n+1Y+XY (mod 2)=2n+1(0.Y1,Y2, … ,Y n)+XY (mod 2)因为2n(0.Y1,Y2, … ,Y n)是个大于或等于1的正整数,所以2n+1(0.Y1,Y2, … ,Y n)=2 (mod 2)所以[X]补*[Y]补=2+XY (mod 2)=[XY]补我的第一个疑问是:当2+X=2n+1+X (mod 2)时,(2+X)*Y≡(2n+1+X)*Y (mod 2)吗?显然,左右两边不是恒等的。
因为Y为小数,所以在模2的情怳下,2Y不恒等于2n+1 Y,所以上式不成立。
我的第二个疑问是:[X]补*Y=(2+X)*Y (mod 2)吗?我们很容易产生这样的误区,认为上式是相等的。
但是仔细推敲一下,便会发现,上式左边是补码运算,遵守补码运算法则。
而右边是真值运算,可以看作原码运算,遵守原码运算法则。
更细一步说,在进行右移运算时,上式左边空位补1,右边空位补0。
所以,上式不成立。
我的第三个疑问是:[X]补*Y到底等于什么呢?下面我们就来解决这一疑问。
设[X]补=(11…1)X0.X1,X2, … ,X n设2+X=(00..0)X0.X1,X2, … ,X n上面括号里的1或0是为该数右移时补空位用的,遵守原码空位补0、补码空位补1原则。
因为X是负数,所以X0=1,对于原码范畴的2+X来讲,发生溢出,右移一位时空位补1。
所以:右移1位时,[X]补=(11…1)1.X0,X1,X2, … ,X n2+X=(00..0)0.X0,X1,X2, … ,X n两者相差1。
右移2位时,[X]补=(11…1)1.1,X0,X1,X2, … ,X n2+X=(00..0)0.0,X0,X1,X2, … ,X n两者相差1.1。
……又[X]补*Y=0.1Y1[X]补+0.01Y2[X]补+ … +0.00 … 01Y n[X]补(2+X)*Y=0.1Y1(2+X)+0.01Y2(2+X)+ … +0.00 … 01Y n (2+X)两者相差1 Y1+1.1 Y2+1.11 Y3+……所以[X]补*Y=(2+X)*Y+1 Y1+1.1 Y2+1.11 Y3+……(mod 2)=2(0.Y1,Y2, … ,Y n)+XY+1 Y1+1.1 Y2+1.11 Y3+……(mod 2)=2(Y1+Y2+ … +Y n)+XY (mod 2)因为Y1+Y2+ … +Y n是大于或等于1的正整数,所以上式=2+XY (mod 2)=[XY]补这里需要说明一下,因为[X]补*Y过程中一直在进行模2运算,所以后面必须有模2操作。
六、结束语由于本文采用Word2003格式编写,不便举例,还望谅解。
注1:这是补码的真值表示公式,同样适用于非负数,这里不再证明。
参考文献1、计算机组成原理PPT-刘子良2、补码一位乘法的证明-quzy。