booth算法实验报告Word文档下载推荐.docx

上传人:b****5 文档编号:16522642 上传时间:2022-11-24 格式:DOCX 页数:10 大小:27.21KB
下载 相关 举报
booth算法实验报告Word文档下载推荐.docx_第1页
第1页 / 共10页
booth算法实验报告Word文档下载推荐.docx_第2页
第2页 / 共10页
booth算法实验报告Word文档下载推荐.docx_第3页
第3页 / 共10页
booth算法实验报告Word文档下载推荐.docx_第4页
第4页 / 共10页
booth算法实验报告Word文档下载推荐.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

booth算法实验报告Word文档下载推荐.docx

《booth算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《booth算法实验报告Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。

booth算法实验报告Word文档下载推荐.docx

末位加一时需注意,若最后一位为零,则置末位为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;

七、运行结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1