booth算法实验报告Word文档下载推荐.docx
《booth算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《booth算法实验报告Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
末位加一时需注意,若最后一位为零,则置末位为1,进位标志为零,反之,若最后一位为一,置末位为0,进位标志为1,向前进位。
3.Booth算法
在Booth算法的实现中,包括加法和移位两种操作。
实现算法时,乘法运算前A寄存器被清零,作为初始部分积。
Q寄存器末位清零,作为附加位的初态。
被乘数的补码存在X中(双符号位),乘数的补码在Q高n+1位中,计数器C存放乘数的位数n。
乘法开始后,根据Q寄存器末两位Qn,Qn+1的状态决定部分积与被乘数相加还是相减,或是不加也不减,然后按补码规则进行算数移位,这样重复n次。
最后,根据Q的末两位状态决定部分积与被乘数相加还是相减,或是不加也不减,但不必移位,这样便可得到最后结果。
五、程序框图
开始开始输入X真值Intb输入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
1001
QnQn+1
00(A)-(D)?
A(A)+(D)?
A11
A,Q同时算数右移一位
(C)-1?
NY
C=0?
00
(A)+(X)?
A11(A)-(X)?
A
Booth算法执行框
图
六、程序源代码
#include<
stdio.h>
#definen4
intxsign,ysign,x_sign;
intZ[2*n+2]={0};
//部分积连接乘数移动后的数组即输出结果
intX[n+1];
intY[n+1];
intXfb[n+1];
int*Xbuffer,*Ybuffer,*X_buffer;
intstr1[n],str2[n],str3[n];
voidBOOTH(intstrX[],intstrY[],intstr_xb[]){//strY是乘数数组指针strX是被乘数补码指针
str_xb是负的被乘数的补码指针
intx=0,i,j,r;
intb=0;
//进位标志位
inta[20]={0};
//存入部分积,部分积的初值为零
intfeg;
for(i=0;
i<
n+1;
i++)
Z[i+n+1]=strY[i];
for(j=n;
j>
=1;
j--)
{
if((strY[j]==0&
&
x==0)||(strY[j]==1&
x==1))
//算术右移
feg=Z[0];
2*n+2;
i++){
Z[2*n+1-i]=Z[2*n-i];
//最后一位开始后移
}
Z[0]=feg;
//最后一位设成标志位}
elseif(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;
elseif(Z[i]+strX[i]+b<
2)
{Z[i]=Z[i]+strX[i]+b;
b=0;
elseif(strY[j]==1&
x==0)
{b=0;
{if(Z[i]+str_xb[i]+b>
=2)
{Z[i]=Z[i]+str_xb[i]+b-2;
elseif(Z[i]+str_xb[i]+b<
{Z[i]=Z[i]+str_xb[i]+b;
x=strY[j];
if(strY[0]==0&
elseif(strY[0]==1&
//结果输出
for(inthp=0;
hp<
=2*n;
hp++){
if(hp==1)
printf("
.%d"
Z[hp]);
else
%d"
}}
int*Complement(int*str,int*buffer,intsign){
intb;
buffer[0]=sign;
if(sign==0){
for(inti=1;
buffer[i]=str[i-1];
else{
for(intm=0;
m<
n;
m++)
{if(str[m]==1)
buffer[m+1]=0;
elseif(str[m]==0)
buffer[m+1]=1;
if(buffer[n]==1){
buffer[n]=0;
for(intk=n-1;
k>
k--)
if((buffer[k]+b)==2)
buffer[k]=0;
elseif(buffer[k]+b<
buffer[k]=buffer[k]+b;
elseif(buffer[n]==0){
buffer[n]=1;
returnbuffer;
intmain(){
布斯算法的实现\n"
);
请输入X的绝对值:
\n"
for(intj=0;
j<
j++){
scanf("
&
str1[j]);
};
请输入X的符号:
xsign);
Xbuffer=Complement(str1,X,xsign);
请输入Y的绝对值:
for(intpy=0;
py<
py++){
str2[py]);
请输入Y的符号:
ysign);
Ybuffer=Complement(str2,Y,ysign);
for(intk=0;
k<
k++){
X[k]=Xbuffer[k];
[X]的补码是:
"
for(intmj=0;
mj<
mj++){
if(mj==1)
X[mj]);
for(inti=0;
str3[i]=X[i+1];
X_buffer=Complement(str3,Xfb,1);
if(xsign==1)
Xfb[0]=0;
Xfb[0]=1;
for(intpk=1;
pk<
pk++){
Xfb[pk]=X_buffer[pk];
[-X]的补码是:
for(intnj=0;
nj<
nj++){
if(nj==1)
Xfb[nj]);
for(intmk=0;
mk<
mk++){
Y[k]=Ybuffer[mk];
[Y]的补码是:
for(intqj=0;
qj<
qj++){
if(qj==1)
Y[qj]);
reslut:
X*Y="
BOOTH(X,Y,Xfb);
return0;
七、运行结果