⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 定点运算9.cpp

📁 实现二进制定点运算: 1.定点整数补码加法 2.定点整数补码减法 3.定点小数Booth补码一位乘法 4.定点小数原码一位除法(加减交替法) 5.定点小数补码一位除法(加减交替法)
💻 CPP
📖 第 1 页 / 共 2 页
字号:

}
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 + -