我想做c语言的模拟CPU乘法算法的小程序算法错误
但我却不知道错在哪里了,初学者希望大神能帮忙做下#include "stdio.h"
void AddBool(char a,char b,char n);
void Displacement(char x[],int t);
char m=0,n=0;
void main()
{
char Product={"00000000"},Parproduct={"00000000"};
char *p1,*p2;
p1=Product+4;
p2=Parproduct+4;
scanf("%c",p1);
scanf("%c",p2);
n=0;
Displacement(Parproduct,9);
for(int i=0 ;i<=7;i++)
{
AddBool(Product,Parproduct,n);
Displacement(Parproduct,8);
Product=m;
if(i=7){Product=n;}
}
for(int j=7;j>=0;j--)
{
printf("%c",Product);
}
}
void AddBool(char a,char b,char n)//一位加法算法
{
if(a&&b){n=1;}
if(n&&b){n=1;}
if(a&&b){n=1;}
m=a^b^n;
}
void Displacement(char x[],int t)
{
for(int i=6;i>=0;i--)
{
x=x;
}
}
丨零丶 发表于 2014-3-13 00:27
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构从键盘输入一个被乘数Multiplicandc和一个乘数Mult ...
1010
* 1101
————————— ——
1010
00 00
1 010
1 01 0
————————————
1 0 0 0 00 10
太马虎了 。。。
题外话,CPU真不是这样计算乘法的,不过只是一个描述逻辑的题,可以练一下代码。
#include "stdafx.h"
#include <string.h>
#include <windows.h>
#define MAX 100
char szNum1[] = "1011111101"; // 765
char szNum2[] = "10111"; // 23
char szCount = {'0'}; // 100010010111011// 17595
VOID AddString(char* szCount )
{
int i = 0;
do
{
if ( *(szCount + i) & 0xCF )
{
*(szCount + i ) = 0x30;
}
else
{
*(szCount + i ) = 0x31;
break;
}
i++;
}
while( i < MAX - 20 );
}
VOID ShowString()
{
int nlen = strlen(szCount) - 1;
BOOL bFind = FALSE;
for ( int i = 0; i <= nlen ; i++ )
{
if ( bFind == FALSE && *(szCount + nlen - i ) == '0' )
{
continue;
}
bFind = TRUE;
printf("%c",*(szCount + nlen - i ));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
memset(szCount,'0',MAX);
int nLen1 = strlen(szNum1) - 1;
int nLen2 = strlen(szNum2) - 1;
for ( int i = 0 ; i <= nLen2 ; i++ )
{
for ( int j = 0; j <= nLen1 ; j++ )
{
char t = (szNum2[ nLen2 - i ] & 0xCF) & (szNum1[ nLen1 - j] & 0xCF);
if ( (szCount & 0xCF) && t )
{
szCount = '0';
AddString( szCount + j + i + 1 );
}
else
{
if ( !(szCount & 0xCF) )
{
szCount = ( t | 0x30 );
}
}
}
}
ShowString();
return 0;
}
我录过一套C视频 免费的 有兴趣的话你可以看下
Displacement 参数t从未使用。Add bool函数中n永远是零 Nisy 发表于 2014-3-11 21:53
Displacement 参数t从未使用。Add bool函数中n永远是零
在算法中我将n作为全局变量每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位传递的参数的,而那个函数中的t我是作为数组变量的长度传递进去的t可以不做使用的 丨零丶 发表于 2014-3-12 19:35
在算法中我将n作为全局变量每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位 ...
CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂你代码的意思
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构从键盘输入一个被乘数Multiplicandc和一个乘数Multiplierc
之后定义一个函数CTB()来转换这两个输入项,转换成bool类型的Multiplicandb,Multiplierb,因为bool类型的数值是1和0,长得像CPU的0跟1所以用这种类型
接着定义一个FA函数用来做逻辑运算,将Product的前四位跟Multiplicandb按位做逻辑运算进位数据保存在c中,运算前将Product进行移位运算Displacement;
最后将Product转换成字符串输出。模型为
1010
* 1101
————————— ——
1010
1 010
00 00
1 01 0
————————————
1 10 11 10
#include "stdio.h"
void ALU(bool x[],bool y[],bool p[],bool g[],bool c[]);
void FA(bool a,bool b,bool c[]);
void CTB(char a[],bool b[],int i);
void Displacement(bool a[],int i,bool b[]);
void BTC(bool a[],char b[],int i);
//函数定义
void main()
{
char Multiplicandc,Multiplierc,Depositc;
bool Multiplicandb,Multiplierb;
bool Depositb={00};
bool Product={00000000};
bool p,g,c={00000};
int i,n;
//变量定义
printf("请输入两个四位二进制数(例如:1111,0001,0101 两数用空格或回车隔开):");
scanf("%s%s",Multiplicandc,Multiplierc);
//数据输入
CTB(Multiplicandc,Multiplicandb,3);
CTB(Multiplierc,Multiplierb,3);
CTB(Multiplicandc,Product,3);
//类型转换
for(n=0;n<=3;n++)
{
Displacement(Product,7,c);
ALU(Multiplicandb,Product,p,g,c);
for(i=3;i>=0;i--)
{
FA(p,g,Depositb);
Product= Depositb;
}
}//算法
BTC(Product,Depositc,8);
printf("计算结果:%s",Depositc);
return;
}
void ALU(bool x[],bool y[],bool p[],bool g[],bool c[])//4位全加部件ALU
{
for(int t=0;t<=3;t++)
{
p=x||y;
g=x&&y;
}
for(int i=0;i<=3;i++)
{
int j=1;
c=(p&&c)||g;
j++;
}
return;
}
//1位逻辑运算,c[]作为寄存器,其中c储存计算结果,c用作存储上次计算结果的进位,c[]指向主函数的Depositb
void FA(bool a,bool b,bool c[])
{
if((a||b)&&(a||c)&&(b||c)){c=true;}
c=a^b^c;
c=false;
return;
}
void CTB(char a[],bool b[],int i)//char转bool
{
for(;i>=0;i--)
{
if(a=='0'){b=false;}
else{b=true;}
}
return;
}
void Displacement(bool a[],int i,bool b[])//数组移位,右移一位,左边用j值填充,右边一位抛弃
{
for(;i>=0;i--)
{
if(i=0){a=b;break;}
a=a;
}
b=0;
return;
}
void BTC(bool a[],char b[],int i)//bool 转char
{
for(;i>=0;i--)
{
if(i=8){b='\0';continue;}
if(a=false){b='0';}
else{b='1';}
}
return;
}
这是我优化后的代码但是还是输出不了结果一直在运行 Nisy 发表于 2014-3-12 21:35
CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...
楼上是我优化后的代码和思路 但是依然无法输出结果 求支援 Nisy 发表于 2014-3-12 21:35
CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...
我是初学者 难免会饭诸多错误请多多指教 帮我找找错误3QVRMC Nisy 发表于 2014-3-13 03:32
1010
* 1101
————————— ——
话说不是我非要这么写 我知道CPU的乘法计算方式--阵列乘法运算但是作业要求的是这种算法 。。。。。。。。
Nisy 发表于 2014-3-13 03:32
1010
* 1101
————————— ——
另外我是初学者你要理解初学者的苦衷啊
页:
[1]
2