Tfe

Ongi etorri tfe-ren webgunera...

Old stuff/ecole_etude_fac_de_pau/pierre/calcu_binaire/calcbin.cc~

(Deskargatu)
#include<iostream.h>

int exposant(int* x,int* y)
{
 int a=0;
 int b=0;
for (int j=1;j<9;j++)
    {
      a=x[j]*(1<<(8-j))+a;
      b=y[j]*(1<<(8-j))+b;
    }
return a-b;
}



int* conversion()

{
  int i=0;
  int p_entiere;
  float p_virgule;
  int k;
  int l;
  int m;

  int temp[8];


  //mantisse
  cout << "rentrer la partie entiere du r�el a convertir : ";
  cin >> p_entiere;



  int* tab=new int[23];
 if(p_entiere>=0)
   {
    tab[0]=0;
    }
 else {
    tab[0]=1;
    }


  
  i=0;
  k=1;
  while (p_entiere > 1)
    {
    k++;
    temp[i] = p_entiere % 2;
    p_entiere = p_entiere / 2;
    i++;
    }
    temp[i]=p_entiere;
    k--;
    
    temp[i]=p_entiere;
    for(i=1;i<=k;i++)
    {
    tab[9+i]= temp[k-i];
    }


    
    
  cout << "rentrer le nombre apres la virgule : ";
  cin >> p_virgule;

  for(int j=9+k;j<32;j++)
    {
      p_virgule=p_virgule*2;
      if (p_virgule >= 1)
	{ 
	     tab[j]=1;
	   p_virgule=p_virgule - 1;
 	}
      else {
        tab[j]=0;
	}
     } 

    
    l = 127 + k;
    for(i=8;i>0;i--)
    {
	tab[i] = l % 2;
	l = l/2;
    }
    
    
    
    

     cout << tab[0] << " ";
     for(i=1;i<9;i++)
     {
        cout << tab[i];
     }
     cout << " ";
     
     
     for(i=9;i<32;i++)
     {
        cout << tab[i] ;
     }
     cout << "\n";

    return tab;
}


float soustraction()
{   
    int i;

  int* tbin1=new int [32];
  int* tbin2=new int [32];
  int* t_result=new int [32];
 
  
tbin1=conversion();
tbin2=conversion();
for (i=9;i<32;i++){    cout << tbin2[i] << " "; }        cout << "\n";

//complement a 1 du nombre a enlever

  for(i=9;i<32;i++)
    {
      if(tbin2[i]==0)
	{
	tbin2[i]=1;
	}
      else {tbin2[i]=0;}
    }

for (i=9;i<32;i++){    cout << tbin2[i] << " "; }        cout << "\n";
  //rajout de 1 a ce nombre      
  int ret=1;
  for(i=31;i>=9;i--)
    {
      tbin2[i]=tbin2[i]+ret;
      ret=0;
	if(tbin2[i]>1)
	  {
	    tbin2[i]=0;
	    ret=1;
	  }
    }

for (i=9;i<32;i++){    cout << tbin2[i] << " "; }        cout << "\n";    

    

  //addition du premier nombre ave le compl�ment a deux du second

  int r=0;
  for(int j=31;j>=9;j--)
    {
	t_result[j]=tbin1[j]-tbin2[j]+ r;
	cout << tbin1[j] << " - " << tbin2[j] << " = " << t_result[j] << "\n";	
	r=0;
       if (t_result[j]<0)
         {
	    t_result[j]=t_result[j]+2;
            r=-1;
         }
    }

  //on enleve la retenue la plus a gauche
  t_result[31]=0;

  //affichage du r�sultat
  for(i=9;i<=31;i++)
   {cout << t_result[i];
   }

}

int addition()  {

  int* ptr1=conversion(entier1,decimal1);
  int* ptr2=conversion(entier2,decimal2);
  cout << " addition de " ;
  affiche(ptr1);
  cout << " avec :  ";
  affiche(ptr2);
  cout << "\n";
  int eb_egaux=compare(ptr1,ptr2);
  
 // cas ou les eb sont egaux //
 if (eb_egaux==0 && ptr1[0]==ptr2[0])
   {
   ptr1[8]++;
   int i=8;
   int tab_add[32];
   int retenue=0;
   while(ptr1[i]>1) { ptr1[i]=0; i--; ptr1[i]++; }

   for(i=0;i<9;i++)
     {
       tab_add[i] = ptr1[i];
     }

   for (int i=31;i>8;i--)
     {
       tab_add[i] = ptr1[i-1]+ptr2[i-1]+retenue;
       retenue=0;
       if (tab_add[i]>1) { tab_add[i]-=2; retenue=1; }
     }
   tab_add[9]=retenue;
      affiche(tab_add);
 }
 
 // cas ou les eb sont differents //
 if (eb_egaux!=0 && ptr1[0]==ptr2[0])
   { 
     int tab1[24];
     int tab2[24];
     tab1[0]=tab2[0]=1;
     for (int i=1;i<24;i++)
       {tab1[i]=ptr1[i+8];
       tab2[i]=ptr2[i+8];}
	

     int* max;
     int* ptr;
     int tab_add2[32];
     cout << "eB_egaux = " << eb_egaux << " \n";
     if (eb_egaux>0) { max=ptr1; }
     else { max=ptr2; }

     cout << "Max : ";
     for(int i=0;i<32;i++){
       cout<<max[i];
     }
     cout << "\n";




     while (eb_egaux!=0)
       {
	 if (eb_egaux>0)
	   {
	     ptr=tab2;
	   }
	 else {cout << "tab 1\n";  ptr=tab1; }
	 
	 // decalage
	 for(int i=23;i>0;i--)
	   {
	     ptr[i]=ptr[i-1];
	   }
	 ptr[0]=0;
	 if (eb_egaux>0) { eb_egaux--; }
	 else { eb_egaux++; }
       }

     cout << "FIn du decalage  ! \n";

     int retenue=0;


     for (int i=31;i>8;i--)
       {
	 tab_add2[i] = tab1[i-1-8]+tab2[i-1-8]+retenue;
	 retenue=0;
         if (tab_add2[i]>1) { tab_add2[i]-=2; retenue=1; }
       }

     cout << "Copie de l exaposant : \n";
     for(int i=0;i<9;i++)
       {
	 cout << max[i] << " ";
	 tab_add2[i]=max[i];
       }
     if (retenue ==1) {
       int i=8;
       tab_add2[8]++;
       while(tab_add2[i] > 1)
	 {
	   tab_add2[i]=0;
	   i--;
	   tab_add2[i]++;
	 }
     }


     cout << "\n";
    affiche(tab_add2);



   }




}

int main()
{
cout << "faites votre choix\n";
cout << "1-conversion\n";
cout << "2-addition\n";
cout << "3-soustraction\n";

int n;
cin >> n;

if (n==1)
{ conversion() ;}
if (n==2)
{ 
addition() ;
}
if (n==3)
{
    soustraction();  
}

}