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

          

        
      

Literatura:

  1. "C++ Language Tutorial" Juan Soulie