📄 定点运算9.cpp
字号:
}
void add(int* addend,int ab,int* adder,int db)
{
int c0=0,c1;
int len=ab;if(len>db)len=db;
for(int i=len-1;i>=0;i--){
c1=(addend[i]&adder[i])|((addend[i]|adder[i])&c0);//out<<"c="<<c<<endl;
addend[i]=addend[i]^adder[i]^c0;
c0=c1;
}
}
int* original_mul_one(int * faciend,int fb,int* ier,int rb)
{
int sign=(faciend[0]^ier[0]),count=rb-1,ierbit=rb-1,temp;
setoppr(product,fb,0);
setoppr(product+fb,rb-1,ier+1,rb-1);//product= A:Q
product[0]=0;temp=faciend[0];
int * multier=product+fb;
cout<<" [x]原=";display(faciend,fb,1);cout<<"\tx0="<<faciend[0]<<endl;
cout<<" [y]原=";display(ier,rb,1);cout<<"\ty0="<<ier[0]<<endl;
cout<<"\n 乘积的符号位为 x0 异或 y0 = "<<faciend[0]<<" 异或 "<<ier[0]<<" = "<<sign<<endl;
cout<<"\n 积\t乘数\t\n\n";
faciend[0]=0;
do{
cout<<" ";
display(product,fb,1);cout<<"\t";display(multier,rb-1);cout<<endl;
cout<<"+ ";
if(multier[ierbit-1]){
display(faciend,fb,1);cout<<endl;
add(product,fb,faciend,fb);
}else {
cout<<"0.";
for(int i=0;i<fb-1;i++)cout<<0;
cout<<endl;
}
printline(line);
cout<<"\n ";display(product,fb,1);
cout<<endl;
shr(product,fb+ierbit);
if(count==1){
cout<<" ";
display(product,fb,1);
cout<<"\t";display(multier,rb-1);
}
count--;
}while(count>0);
faciend[0]=temp;
product[0]=sign;
cout<<"\n\n result:";
display(product,fb+rb-1,1);cout<<endl;
return product;
}
int * original_mul_two(int * faciend,int fb,int* ier,int rb)
{
int sign=(faciend[0]^ier[0]),count,ierbit,cj,t1, t2;
int *cplmt=new int [fb+2],*doub=new int [fb+2];
setoppr(cplmt,fb,faciend,fb);setcplmt(cplmt,fb);
setoppr(doub,fb,faciend,fb);shl(doub,fb);
cout<<" [x]原=";display(faciend,fb,1);
cout<<"\t[y]原=";display(ier,rb,1);cout<<endl;
cout<<" [-x]补=";display(cplmt,fb,1);
cout<<"\t2x=";display(doub,fb,1);cout<<endl;
cout<<"\n 乘积符号为x0异或y0 = "<<faciend[0]<<" 异或 "<<ier[0]<<" = "<<sign<<endl;
cout<<"\n 部分积 \t乘数 \tCj\n\n";
product[0]=0;t1=faciend[0];t2=ier[0];
faciend[0]=0;ier[0]=0;cj=0;
fb++;
shr(faciend,fb);fb++;
shr(faciend,fb);
setoppr(product,fb,0);
if(rb%2==0){
shl(ier,rb);
rb--;
}
rb++;shr(ier,rb);
count=rb/2;
setoppr(product+fb,rb,ier,rb);
int * multier=product+fb;
ierbit=rb;int cross;
shr(doub,fb);shr(doub,fb);
sar(cplmt,fb);sar(cplmt,fb);
do{
cout<<" ";
display(product,fb,3);cout<<"\t";display(multier,rb);cout<<"\t"<<cj<<endl;
cross=multier[ierbit-2]*4+multier[ierbit-1]*2+cj;
switch(cross){
case 0:cj=0;
break;
case 7:cj=1;
break;
case 1:
case 2:
cout<<"+ ";
display(faciend,fb,3);cout<<endl;
printline(line);cout<<endl;
cj=0;
add(product,fb,faciend,fb);
break;
case 3:
case 4:
cout<<"+ ";
display(doub,fb,3);cout<<endl;
printline(line);cout<<endl;
cj=0;
add(product,fb,doub,fb);
break;
case 5:
case 6:
cout<<"+ ";
display(cplmt,fb,3);cout<<endl;
printline(line);cout<<endl;
add(product,fb,cplmt,fb);
cj=1;
break;
}
cout<<" ";display(product,fb,3);
if(count>1){
cout<<endl;
sar(product,fb+ierbit);sar(product,fb+ierbit);
}else{
cout<<"\t";
display(multier,rb-2);
}
count--;
}while(count>0);
faciend[0]=t1;ier[0]=t2;
delete []doub;
delete []cplmt;
product[0]=product[1]=product[2]=sign;
cout<<"\n\n 所以,结果是:";
display(product+2,fb+rb-4,1);cout<<endl;
return product;
}
int * booth_one(int * faciend,int fb,int* ier,int rb)
{ tocplmt(faciend,fb);tocplmt(ier,rb);
int count=rb,ierbit=rb+1,*cplmt=new int [fb+1];
sar(faciend,fb+1);ier[rb]=0;
setoppr(product,fb+1,0);
setoppr(product+fb+1,rb,ier,rb+1);
setoppr(cplmt,fb+1,faciend,fb+1);
setcplmt(cplmt,fb+1);
int * multier=product+fb+1;
cout<<" [x]补=";display(faciend+1,fb,1);
cout<<"\t[y]补=";
display(multier,rb,1);
cout<<endl;
cout<<" [-x]补=";display(cplmt+1,fb,1);cout<<endl;
cout<<"\n 部分积\t乘数 yn\t附加位yn+1\t\n\n";
do{
cout<<" ";
display(product,fb+1,2);cout<<"\t";
display(multier,rb);cout<<"\t";
cout<<multier[rb]<<endl;
switch(multier[rb]-multier[rb-1]){
case 1:
cout<<"+ ";
display(faciend,fb+1,2);cout<<endl;
add(product,fb+1,faciend,fb+1);
printline(line);cout<<" ";
display(product,fb+1,2);
break;
case -1:
cout<<"+ ";
display(cplmt,fb+1,2);cout<<endl;
add(product,fb+1,cplmt,fb+1);
printline(line);cout<<" ";
display(product,fb+1,2);
break;
default:break;
}
if(count>1){
sar(product,fb+1+ierbit);
cout<<endl;
}
else{
cout<<"\t";display(multier,rb-1);
}
count--;
}while(count>0);
delete []cplmt;
cout<<"\n\n result is:";
display(product+1,fb+rb-1,1);cout<<endl;
return product;
}
int * original_div(int * dividend,int vb,int *divisor,int sb)
{
int sign=dividend[0]^divisor[0],p;
int count=sb,i;
int * cplmt=new int[sb];
cout<<" [x]原=";display(dividend,vb,1);
cout<<"\t[y]原=";display(divisor,sb,1);cout<<endl;
cout<<"\n 商的符号位 x0 异或 y0 = "<<dividend[0]<<" 异或 "<<divisor[0]<<" = "<<sign<<endl;
dividend[0]=divisor[0]=0;
setoppr(product,vb,dividend,vb);
setoppr(product+vb,sb,0);
setoppr(cplmt,sb,divisor,sb);
setcplmt(cplmt,sb);
cout<<" [-y]=";display(cplmt,sb,1);cout<<endl;
cout<<"\n 被除数(余数)\t商 上商\n\n ";
display(product,vb,1);
cout<<"\t0.";
for(i=1;i<sb;i++)cout<<"0";
cout<<"\n+ ";
display(cplmt,sb,1);cout<<endl;
printline(line);cout<<" ";
add(product,vb,cplmt,sb);
display(product,vb,1);
if(!product[0]){
cout<<"\n overflow!!!!!\n";
return product;
}
cout<<"\t";
for(i=0;i<sb;i++)cout<<" ";cout<<"0\n ";
shl(product,vb+sb);
display(product,vb,1);cout<<"\t";
for(i=1;i<sb;i++)cout<<" ";cout<<"0\n+ ";
display(divisor,sb,1);cout<<"\n";printline(line);cout<<" ";
add(product,vb,divisor,sb);
count--;p=1;
do{
display(product,vb,1);cout<<"\t ";
if(product[0]){
product[vb+sb-1]=0;
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p)cout<<" ";
else cout<<product[i];
}
cout<<"\n ";
if(count>1){
shl(product,vb+sb);p++;
display(product,vb,1);cout<<"\t ";
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p||i==vb+sb-1)cout<<" ";
else cout<<product[i];
}
cout<<"\n+ ";
display(divisor,sb,1);
add(product,vb,divisor,sb);
}
}else{
product[vb+sb-1]=1;
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p)cout<<" ";
else cout<<product[i];
}
cout<<"\n ";
if(count>1){
shl(product,vb+sb);p++;
display(product,vb,1);cout<<"\t ";
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p||i==vb+sb-1)cout<<" ";
else cout<<product[i];
}
cout<<"\n+ ";
display(cplmt,sb,1);
add(product,vb,cplmt,sb);
}
}
if(count>1){
cout<<"\n";
printline(line);
cout<<" ";
}
count--;
}while(count>0);
delete cplmt;
product[vb]=sign;
cout<<"\n resut is:";
display(product+vb,sb,1);cout<<endl;
return product;
}
int * cplmt_div(int * dividend,int vb,int * divisor,int sb)
{
tocplmt(dividend,vb);tocplmt(divisor,sb);
int p;
int count=sb,i;
int * cplmt=new int[sb];
setoppr(product,vb,dividend,vb);//set a
setoppr(product+vb,sb,0);//set x
setoppr(cplmt,sb,divisor,sb);
setcplmt(cplmt,sb);// -x
cout<<" [x]补=";display(dividend,vb,1);
cout<<"\t[y]补=";display(divisor,sb,1);
cout<<endl<<" [-y]补=";display(cplmt,sb,1);cout<<endl;
cout<<"\n 被除数(余数)\t商 上商\n\n ";
display(product,vb,1);
cout<<"\t0.";
for(i=1;i<sb;i++)cout<<"0";
cout<<"\n+ ";
if(product[0]^divisor[0]){
display(divisor,sb,1);
add(product,vb,divisor,sb);
}else{
display(cplmt,sb,1);
add(product,vb,cplmt,sb);
}
cout<<"\n";printline(line);cout<<" ";
display(product,vb,1);count--;
p=0;
do{
cout<<"\t ";
if(product[0]^divisor[0]){
product[vb+sb-1]=0;
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p)cout<<" ";
else cout<<product[i];
}
cout<<"\n ";
if(count>1){
shl(product,vb+sb);p++;
display(product,vb,1);cout<<"\t ";
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p||i==vb+sb-1)cout<<" ";
else cout<<product[i];
}
cout<<"\n+ ";
display(divisor,sb,1);
add(product,vb,divisor,sb);
}
}else{
product[vb+sb-1]=1;
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p)cout<<" ";
else cout<<product[i];
}
cout<<"\n ";
if(count>1){
shl(product,vb+sb);p++;
display(product,vb,1);cout<<"\t ";
for(i=vb;i<vb+sb;i++){
if(i<vb+sb-1-p||i==vb+sb-1)cout<<" ";
else cout<<product[i];
}
cout<<"\n+ ";
display(cplmt,sb,1);
add(product,vb,cplmt,sb);
}
}
if(count>1){
cout<<"\n";printline(line);cout<<" ";
display(product,vb,1);
}else{
shl(product,vb+sb);
product[vb+sb-1]=1;
cout<<" ";
display(product,vb,1);
cout<<"\t ";
display(product+vb,sb);
}
count--;
}while(count>0);
delete cplmt;
cout<<"\n\n result is:";
display(product+vb,sb,1);cout<<endl;
return product;
}
void initial(char* array,int* num,int n)
{
int i;
num[0]=(array[0]=='1');
for( i=2;i<n;i++)if(array[i]=='1')num[i-1]=1;else num[i-1]=0;
}
int errorinput(int v){
int outcome=0;
if(!v){
cout<<" ERROR!!!INPUTAGAIN:";
outcome=1;
}
return outcome;
}
int readoppr(char* op,int* num)
{
if(op==NULL||num==NULL)return 0;
int valid=1,len,i,head=0,sign=0;
do{
cin>>op;
valid=1;
len=strlen(op);
if(len<3||len>maximum+1){
valid=0;
continue;
}
i=0;
if(op[0]=='+'||op[0]=='-'){
sign=(op[0]=='-');
head++;
i++;
len--;
}else if(op[0]!='0'){
valid=0;
continue;
}
if(op[i]!='0'||op[i+1]!='.'){
valid=0;
continue;
}
i+=2;
while(valid&&op[i]!='\0')
if(op[i]!='0'&&op[i]!='1')valid=0;
else i++;
}while(errorinput(valid));
initial(op+head,num,len);
num[0]=sign;
return len-1;
}
void main()
{
char buf[maximum];
int choice,n1,n2,oppr1[maximum],oppr2[maximum];
int blank=5;
int num1,num2;
for(int i=0;i<blank;i++)cout<<endl;
while(1){
cout<<"******************************************************************************\n";
cout<<" 二进制运算器 \n";
cout<<" made by 陈婷 \n";
blank=2;
for(int i=0;i<blank;i++)cout<<endl;
cout<<" 1.定点整数补码加法 2.定点整数补码减法\n";
cout<<" 3.定点小数Booth补码一位乘法 4.定点小数原码一位除法(加减交替法)\n";
cout<<" 5.定点小数补码一位除法(加减交替法)6.定点小数原码一位乘法 \n";
cout<<" 7.定点小数原码两位乘法 8.定点整数原码乘法\n";
cout<<" 9.定点整数原码除法\n";
cout<<"\n 0.exit\n";
cout<<"********************************************************************************\n";
cout<<" 请选择 (0-8) : ";
cin>>choice;
if(choice>2&&choice<8){
cout<<"\nattention!!The data input mustn't beyond"<<maximum<<"bits。\n";
cout<<" for example:+0.1, -0.1111111, 0.10110\n";
}
switch(choice){
case 6:
cout<<" 原码一位乘法\t";
cout<<" 被乘数 : ";
n1=readoppr(buf,oppr1);
cout<<buf<<" * ";
cout<<" 乘数 : ";
n2=readoppr(buf,oppr2);
cout<<buf<<endl<<endl;
original_mul_one(oppr1,n1,oppr2,n2);
break;
case 7:
cout<<" 被乘数 : ";
cout<<" 原码两位乘法\t";
n1=readoppr(buf,oppr1);
cout<<buf<<" * ";
cout<<" 乘数 : ";
n2=readoppr(buf,oppr2);
cout<<buf<<endl<<endl;
original_mul_two(oppr1,n1,oppr2,n2);
break;
case 3:
cout<<" 被乘数 : \t";
cout<<" Booth补码乘法\t";
n1=readoppr(buf,oppr1);
cout<<buf<<" * ";
cout<<" 乘数 : \t";
n2=readoppr(buf,oppr2);
cout<<buf<<endl<<endl;
booth_one(oppr1,n1,oppr2,n2);
break;
case 4:
cout<<" 被除数 : ";
n1=readoppr(buf,oppr1);
cout<<" 原码一位除法(加减交替法)\t"<<buf<<" / ";
cout<<" 除数 : ";
n2=readoppr(buf,oppr2);
cout<<buf<<endl<<endl;
original_div(oppr1,n1,oppr2,n2);
break;
case 5:
cout<<" 被除数 : ";
n1=readoppr(buf,oppr1);
cout<<" 补码一位除法(加减交替法)\t"<<buf<<" / ";
cout<<" 除数 : ";
n2=readoppr(buf,oppr2);
cout<<buf<<endl<<endl;
cplmt_div(oppr1,n1,oppr2,n2);
break;
case 1:
cout<<" 被加数 :";
cin>>num1;
cout<<" 加数 :";
cin>>num2;
if(pow(num1,2)<1||pow(num2,2)<1)
break;
result(num1,num2);
break;
case 2:
cout<<" 被减数 :";
cin>>num1;
cout<<" 减数 :";
cin>>num2;
if(pow(num1,2)<1||pow(num2,2)<1)
break;
num2=-num2;
result2(num1,num2);
break;
case 8:
cout<<" 被乘数 :";
cin>>num1;
cout<<" 乘数 :";
cin>>num2;
result1(num1,num2);
break;
case 9:
cout<<" 被除数 :";
cin>>num1;
cout<<" 除数 :";
cin>>num2;
result3(num1,num2);
break;
default:
cout<<"\n\n\n 谢谢,再见\n";
return;
}
cout<<endl;
cout<<endl<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -