欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
}

相关标签: c语言