- UID
- 74123
注册时间2014-2-24
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
楼主 |
发表于 2014-3-13 00:27:25
|
显示全部楼层
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构 从键盘输入一个被乘数Multiplicandc[5]和一个乘数Multiplierc[5]
之后定义一个函数CTB()来转换这两个输入项,转换成bool类型的Multiplicandb[4],Multiplierb[4],因为bool类型的数值是1和0,长得像CPU的0跟1 所以用这种类型
接着定义一个FA函数用来做逻辑运算,将Product的前四位跟Multiplicandb按位做逻辑运算进位数据保存在c[5]中,运算前将Product进行移位运算Displacement;
最后将Product转换成字符串输出。模型为
1 0 1 0
* 1 1 0 1
————————— ——
1 0 1 0
1 0 1 0
0 0 0 0
1 0 1 0
————————————
1 1 0 1 1 1 0
- #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[5],Multiplierc[5],Depositc[9];
- bool Multiplicandb[4],Multiplierb[4];
- bool Depositb[2]={00};
- bool Product[8]={00000000};
- bool p[4],g[4],c[5]={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[i],g[i],Depositb);
- Product[i]= Depositb[0];
- }
- }//算法
-
- 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[t]=x[t]||y[t];
- g[t]=x[t]&&y[t];
- }
- for(int i=0;i<=3;i++)
- {
- int j=1;
- c[j]=(p[i]&&c[j-1])||g[i];
- j++;
- }
- return;
- }
- //1位逻辑运算,c[]作为寄存器,其中c[0]储存计算结果,c[1]用作存储上次计算结果的进位,c[]指向主函数的Depositb
- void FA(bool a,bool b,bool c[])
- {
- if((a||b)&&(a||c[1])&&(b||c[1])){c[1]=true;}
- c[0]=a^b^c[1];
- c[1]=false;
- return;
- }
- void CTB(char a[],bool b[],int i)//char转bool
- {
- for(;i>=0;i--)
- {
- if(a[i]=='0'){b[i]=false;}
- else{b[i]=true;}
- }
- return;
- }
- void Displacement(bool a[],int i,bool b[])//数组移位,右移一位,左边用j值填充,右边一位抛弃
- {
- for(;i>=0;i--)
- {
- if(i=0){a[0]=b[5];break;}
- a[i]=a[i-1];
- }
- b[5]=0;
- return;
- }
- void BTC(bool a[],char b[],int i)//bool 转char
- {
- for(;i>=0;i--)
- {
- if(i=8){b[8]='\0';continue;}
- if(a[i]=false){b[i]='0';}
- else{b[i]='1';}
- }
- return;
- }
复制代码
这是我优化后的代码 但是还是输出不了结果 一直在运行 |
|