booth算法实验报告
Booth算法的实现
一、目的和要求
采用BOOTH算法,编程实现二进制数的乘法运算,进而了解计算机中定点运算的过程 二、BOOTH算法的算法思想
Booth算法是比较好的带符号数乘法的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
。它采用相加和相减的操作计算补码数据的乘积。Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作。判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。 BOOTH算法的算法思想是让乘数近似于某个较大的整值,然后用这个数值与被乘数的乘积减去其对应这个整值数的补数与被乘数的乘积来进行计算,从而提高了乘法的运算效率。
三、BOOTH算法原理
Booth算法为补码一位乘,其具体实现过程为:给末位添加一个附加位x,与乘数的最后一位组成判断条件来决定部分积作何操作。其中,乘数最后一位与x一共有四种组合情况分别为:00,01,10,11。四种情况的具体操作分别为:00,部分积右移一位,01 部分积加被乘数的补码再右移一位形成新的部分积,10部分积加[-x]的补码后右移一位形成新的部分积,11部分积右移一位。
四、程序实现过程
此算法由主函数和一个求补函数,一个booth算法构成。
1.主函数
在主函数中,首先需要输入x的绝对值,x的符号以及y的绝对值,y的符号,其次,需要根据输入的值去调用求补函数求出x,y和(-x)的补码,最后再根据对booth函数的调用求得由booth算法实现的乘法的结果
2.求补函数
在求补函数中,在执行过程中需要先判断其符号位,根据其符号位求补,如果这个需要求补的数为正数则其补码就是这个正数,如果这个数是负数,则需要对其除符号位按位取反,再在末位加一。末位加一时需注意,若最后一位为零,则置末位为1,进位标志为零,反之,若最后一位为一,置末位为0,进位标志为1,向前进位。
3.Booth算法
在Booth算法的实现中,包括加法和移位两种操作。实现算法时,乘法运算前A寄存器被清零,作为初始部分积。Q寄存器末位清零,作为附加位的初态。被乘数的补码存在X中(双符号位),乘数的补码在Q高n+1位中,计数器C存放乘数的位数n。乘法开始后,根据Q寄存器末两位Qn,Qn+1的状态决定部分积与被乘数相加还是相减,或是不加也不减,然后按补码规则进行算数移位,这样重复n次。最后,根据Q的末两位状态决定部分积与被乘数相加还是相减,或是不加也不减,但不必移位,这样便可得到最后结果。 五、程序框图
开始 开始 输入X真值 Int b 输入X的符号 Buffer[0]=sign 求X的补码 Sign=0 输入Y的真值 X补=X 绝对值按位取反
输入Y的符号 末位加一
求Y的补码
求得补码 输出Y的补码
输出补码 输出-X的补码
输出Y的补码 结束 Booth算法
输出结果
结束
求补函数 主函数
开始
0?A,0?Qn+1
被乘数(补码)?X
乘数(补码)?Q
n?C
10 01
QnQn+1
00 (A)-(D) ?A (A)+(D) ?A 11
A,Q同时算数右移一位
(C)-1?C
N Y
C=0?
10 01
QnQn+1
00
(A)+(X) ?A 11 (A)-(X) ?A
结束
Booth算法执行框
图
六、程序源代码
#include
#define n 4
int xsign,ysign,x_sign;
int Z[2*n+2]={0}; //部分积连接乘数移动后的数组 即输出结果
int X[n+1];
int Y[n+1];
int Xfb[n+1];
int *Xbuffer,*Ybuffer,*X_buffer;
int str1[n],str2[n],str3[n]; void BOOTH (int strX[],int strY[],int str_xb[]){//strY是乘数数组指针 strX是被乘数补码指针
str_xb是负的被乘数的补码指针
int x=0,i,j,r;
int b=0;//进位标志位
int a[20]={0}; //存入部分积,部分积的初值为零
int feg;
for(i=0;i=1;j--)
{
if((strY[j]==0&&x==0)||(strY[j]==1&&x==1))
{
//算术右移
feg=Z[0];
for(i=0;i<2*n+2;i++){
Z[2*n+1-i]=Z[2*n-i];//最后一位开始后移
}
Z[0]=feg; //最后一位设成标志位}
else if(strY[j]==0&&x==1)
{b=0;
for(i=n;i>=0;i--)
{if(Z[i]+strX[i]+b>=2)//加x的补码
{Z[i]=Z[i]+strX[i]+b-2;
b=1;
}
else if(Z[i]+strX[i]+b<2)
{Z[i]=Z[i]+strX[i]+b;
b=0;
}
}
//算术右移
feg=Z[0];
for(i=0;i<2*n+2;i++){
Z[2*n+1-i]=Z[2*n-i];
}
Z[0]=feg;}
else if(strY[j]==1&&x==0)
{ b=0;
for(i=n;i>=0;i--)
{if(Z[i]+str_xb[i]+b>=2)
{Z[i]=Z[i]+str_xb[i]+b-2;
b=1;
}
else if(Z[i]+str_xb[i]+b<2)
{Z[i]=Z[i]+str_xb[i]+b;
b=0;
}
}
//算术右移
feg=Z[0];
for(i=0;i<2*n+2;i++){
Z[2*n+1-i]=Z[2*n-i];
}
Z[0]=feg;}
x=strY[j];
}
if(strY[0]==0&&x==1)
{b=0;
for(i=n;i>=0;i--)
{if(Z[i]+strX[i]+b>=2)
{Z[i]=Z[i]+strX[i]+b-2;
b=1;
}
else if(Z[i]+strX[i]+b<2)
{Z[i]=Z[i]+strX[i]+b;
b=0;
}
}
}
else if(strY[0]==1&&x==0)
{b=0;
for(i=n;i>=0;i--)
{if(Z[i]+str_xb[i]+b>=2)
{Z[i]=Z[i]+str_xb[i]+b-2;
b=1;
}
else if(Z[i]+str_xb[i]+b<2)
{Z[i]=Z[i]+str_xb[i]+b;
b=0;
}
}
}
//结果输出
for(int hp=0;hp<=2*n;hp++){
if(hp==1)
printf(".%d",Z[hp]);
else
printf("%d",Z[hp]);
}}
int * Complement(int *str,int *buffer,int sign){
int b;//进位标志位
buffer[0]=sign;
if(sign==0){
for(int i=1;i=1;k--)
{
if((buffer[k]+b)==2)
{
buffer[k]=0;
b=1;
}
else if(buffer[k]+b<2)
{
buffer[k]=buffer[k]+b;
b=0;
}
}
}
else if(buffer[n]==0){
buffer[n]=1;
}
}
return buffer;
}
int main(){
printf("布斯算法的实现\n");
printf("请输入X的绝对值:\n");
for(int j=0;j
本文档为【booth算法实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。