#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];
}
}
原码一位乘法
最新推荐文章于 2022-09-14 21:00:37 发布