原码一位乘法

#include <stdio.h>
void readBin(char bin[], int n);
void printBin(char bin[], int n);
void mulBin(char x[],char y[],char c[], int n);
void printlnBin(char bin[], int n);
void printLine();
void printC(char c[],int n);
void prompt();
int main()
{
	char x[6],y[6],c[4];
	int i;
	
	prompt();
	printf("输入X(原码):");
	readBin(x,6);
	printf("输入Y(原码):");
	readBin(y,6);

	printf("开始计算.....\n");
	
	for(i=0;i<4;i++)
		c[i]=y[i+2];
	mulBin(x, y, c, 4);

	printf("结果为:\n");
	printBin(x,6);
	printf("\t");
	printlnBin(c,4);

	return 0;
}

void prompt(){
	printf("***********************************************\n");
	printf("\t本程序用于模拟原码一位乘法的计算过程\n");
	printf("\t程序需要输入两个纯小数原码,小数部分4位。\n");
	printf("\t源码数输入格式样例:1.1011,表示-0.1011 \n");
	printf("\t编程者:Jinzheng Zhang.\n");
	printf("***********************************************\n");
}
void printLine(){
	printf("\t------------\n");
}
void readBin(char bin[], int n){
	int i;
	for(i=0;i<n;i++)
		scanf("%c",&bin[i]);
	fflush(stdin);
}
void printBin(char bin[], int n){
	int i;
	for(i=0;i<n;i++)
		printf("%2c",bin[i]);
}
void printlnBin(char bin[], int n){
	int i;
	for(i=0;i<n;i++)
		printf("%2c",bin[i]);
	printf("\n");
}
void printC(char c[],int n){
	int i;
	for(i=0;i<n-1; i++)
		printf("%2c",c[i]);
	printf(" [%c]\n",c[n-1]);
}
int addBin(char a[],char b[],int n){
	int i,j,s,c=0;
	for(j=1;j<=n;j++){
		i=6-j;
		s=(a[i]-48+b[i]-48+c)%2 +48;
		c=(a[i]-48+b[i]-48+c)/2 ;
		a[i]=s;
	}
	return c;
}

void mulBin(char x[],char y[],char c[], int n){
	int i,j,k;
	char ac;
	char xx[6],x0[6]; //xx存放部分积;x0存放临时加数,x值或0

	for(i=0;i<2+n;i++)
		xx[i]='0';
	x0[0]='0';
	x0[1]='0';

	printLine();

	printf("\t");
	printBin(xx,6);
	printf("\t");
	printC(c,4);
	for(i=1;i<=n;i++) {
		//乘数末尾位0,+0; 为1,+X
		for(k=2;k<6;k++)
			if(c[3]=='0'){
				x0[k]='0';
				ac='0';
			} else  {
				x0[k]=x[k];
				ac='X';
			}
		printf("+%c\t",ac);
		printlnBin(x0,6);
		printLine();
		addBin(xx,x0,6);
		printf("\t");
		printlnBin(xx,6);
		//乘数C,部分积xx右移一位
		for(k=3;k>0;k--)
			c[k]=c[k-1];
		c[0]=xx[5];
		for(k=5;k>0;k--)
			xx[k]=xx[k-1];
		xx[0]='0';
		printf("右移1位\t");
		printBin(xx,6);
		printf("\t");
		printC(c,4);
		}

	x[0]=(x[0]!=y[0])+48;
	for(k=2;k<n+2;k++){
		x[k]=xx[k];
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值