C程序实现-定点数的乘法与除法
程序员文章站
2024-01-31 14:20:52
...
输入两个二进制定点整数,用原码一位乘法输出两数的乘积,再用原码恢复余数法,输出两数相除的商和余数。
#include "stdio.h"
#define W 5
#define S 4
#define N 9
void input(int map[])
{ int i=W;char t[W]={0};int j=0;
scanf("%s",t);
while(i)
{
if(t[i-1]=='+') map[S]=0;
if(t[i-1]=='-') map[S]=1;
if(t[i-1]=='1') map[j++]=1;
if(t[i-1]=='0') map[j++]=0;
i--;
}
}
void output(int map[])
{
int i=W;
while(i)
{
printf("%d",map[i-1]);
i--;
}
}
int fanma(int map[])
{ int i;
if(map[S]==0)
{
return 0;
}
else
{
i=S;
while(i>0)
{
if(map[i-1]==1) map[i-1]=0;
else map[i-1]=1;
i--;
}
}
}
int buma(int map[])
{ if(map[S]==0) return 0;
else
{ int i=0;
while(map[i]&&i<5)
{
map[i++]=0;
}
map[i]=1;
}
}
void ymcf(int x[],int y[],int bfj[])
{
int i,j,k=0;
for(i=0;i<S;i++)
{
bfj[i]=y[i];
}
for(i=0;i<S;i++)
{
if(bfj[0]==1)
{
for(j=0;j<S;j++)
{
k=bfj[j+S]=x[j]+bfj[j+S];
if(k==2)
{
bfj[j+S]=0;
bfj[j+W]=bfj[j+W]+1;
}
if(k==3)
{
bfj[j+S]=1;
bfj[j+W]=bfj[j+W]+1;
}
}
}
for(j=0;j<8;j++) //右移
{
bfj[j]=bfj[j+1];
}
bfj[8]=0;
}
if(x[S]!=y[S])
{
bfj[8]=1;
}
i=N;
while(i)
{
printf("%d",bfj[i-1]);
i--;
}
}
void hfyschufa(int x[],int y[])
{
int i,j,k,p,q,flag=0;int ty[W+1]={0};int boss[11]={0};
for(i=0;i<W;i++)
{
ty[i]=y[i];
}
fanma(ty);
buma(ty);
ty[W]=ty[S]=1;
for(i=0;i<S;i++)
{
boss[i+W]=x[i];
}
for(i=0;i<W;i++)
{
for(j=0;j<6;j++)
{
k=boss[j+W]=boss[j+W]+ty[j];
if(k==2)
{
boss[j+W]=0;
boss[j+W+1]=boss[j+W+1]+1;
}
if(k==3)
{
boss[j+W]=1;
boss[j+W+1]=boss[j+W+1]+1;
}
}
if(boss[N]==1)
{
boss[0]=0; flag++;
for(j=0;j<4;j++)
{
k=boss[j+W]=boss[j+W]+y[j];
if(k==2)
{
boss[j+W]=0;
boss[j+W+1]=boss[j+W+1]+1;
}
if(k==3)
{
boss[j+W]=1;
boss[j+W+1]=boss[j+W+1]+1;
}
}
}
else
{
boss[0]=1; flag++;
}
if(flag==W) break;
for(p=10;p>0;p--)
{
boss[p]=boss[p-1];
}
boss[0]=0;
}
if(x[S]!=y[S])
{
printf("Q原=1.");
for(i=3;i>=0;i--)
{
printf("%d",boss[i]);
}
printf(" ");
}
else
{
printf("Q原=0.");
for(i=3;i>=0;i--)
{
printf("%d",boss[i]);
}
printf(" ");
}
printf("R原=%d.0000",x[S]);
for(i=3;i>=0;i--)
{
printf("%d",boss[i+W]);
}
printf("\n");
}
main()
{ int a,b;int tx[W]={0};int ty[W]={0};int bfj[N]={0};
printf("请输入一个二进制定点整数x:");
input(tx);
printf("请输入一个二进制定点整数y:");
input(ty);
printf("X*Y:");
ymcf(tx,ty,bfj);
printf("\nX/Y:");
hfyschufa(tx,ty);
}