|
Program obrazujący dodawanie odejmowanie i mnożenie w zapisie binarnym
#include <cstdlib>
#include <iostream>
using namespace std;
const int s=16;
int * all(int a[])//wypelnienie wektora zerami
{
for(int j=0;j<s;j++) a[j]=0;
return a;
}
int * inv(int a[],int b[])//odwrocenie bitowe
{
for(int i=0;i<s;i++) if(a[i]) b[i]=0; else b[i]=1;
return b;
}
unsigned power(int y)// potega 2 do y
{
unsigned x=1;
for(int i=0;i<y;i++) x=x*2;
return x;
}
int * dectobin(int a[],int n) //konwersja z dziesietnej na binarna
{
a=all(a);
int i=s-1;
if (n>=0)
{
while((n>=1)&&(i>=0))
{
a[i]=n%2;
n=n/2;
i--;
}
}
else
{
a[0]=1;
n=power(16)+n;
while((n>=1)&&(i>0))
{
a[i]=n%2;
n=n/2;
i--;
}
}
return a;
}
void prbin(int a[]) //wypisuje tablice binarna
{
for(int i=0;i<s;i++) cout<<a[i];
}
int bintodec(int a[])// konwersja z binarnej na dziesietna
{
int x=0;
for(int i=s-1;i>0;i--) if(a[i]) x=x+power(s-1-i);
x=x-a[0]*power(s-1);
return x;
}
void pr(int a[],int b[],int c[],char z) //wypisuje dzialanie
{
prbin(a);cout<<" "<<bintodec(a)<<endl;
prbin(b);cout<<z<<" "<<z<<bintodec(b)<<endl;
cout<<"----------------- ----"<<endl;
prbin(c);cout<<" "<<bintodec(c)<<endl<<endl;
}
int * addb(int a[],int b[],int c[]) //dodawanie
{
int p=0;
for(int j=s-1;j>=0;j--)
{
c[j]=(p+a[j]+b[j])%2;
if((p+a[j]+b[j])>=2) p=1; else p=0;
}
return c;
}
int * opp(int a[],int b[])
{
int * c;
int * d;
c=new int [s];
d=new int [s];
c=all(c);
d=all(d);
c[s-1]=1;
d=inv(a,d);
b=addb(d,c,b);
delete [] c;
delete [] d;
return b;
}
int * subb(int a[],int b[],int c[])//odejmowanie
{
int * d;
int * e;
int * f;
c=all(c);
d=new int [s];
e=new int [s];
f=new int [s];
d=all(d);
e=all(e);
f=all(f);
d[s-1]=1;
e=inv(b,e);
f=addb(e,d,f);
c=addb(a,f,c);
delete [] d;
delete [] e;
delete [] f;
return c;
}
int * mul(int a[],int b[],int c[])
{
int p=0;
int * d;
int * e;
int * f;
int * g;
c=all(c);
d=new int [s];
e=new int [s];
f=new int [s];
g=new int [s];
d=all(d);
e=all(e);
f=all(f);
g=all(g);
if(a[0])
{
d=opp(a,d);
p++;
}
else for(int j=0;j<s;j++) d[j]=a[j];
if(b[0])
{
f=opp(b,f);
p++;
}
else for(int j=0;j<s;j++) f[j]=b[j];
for(int i=s-1;i>=0;i--)
{
if(f[i])
{
for(int m=0;m<s;m++) e[m]=c[m];
for(int k=0;k<=i;k++) g[k]=d[k+s-1-i];
for(int l=i+1;l<s;l++) g[l]=0;
c=addb(e,g,c);
}
}
delete [] e;
delete [] f;
delete [] g;
if(p==1)
{
for(int j=0;j<s;j++) d[j]=c[j];
c=opp(d,c);
}
delete [] d;
return c;
}
int * dz(int a[],int b[],int c[])
{
}
int main(int argc, char *argv[])
{
int x=0, y=0;
int * a;
int * b;
int * c;
a=new int [s];
b=new int [s];
c=new int [s];
c=all(c);
cout<<"podaj dwie liczby"<<endl;
cin>>x;
cin>>y;
a=dectobin(a,x);
b=dectobin(b,y);
c=addb(a,b,c);
pr(a,b,c,'+');
c=subb(a,b,c);
pr(a,b,c,'-');
c=mul(a,b,c);
pr(a,b,c,'*');
delete [] a;
delete [] b;
delete [] c;
system("PAUSE");
return EXIT_SUCCESS;
}
|