Old stuff/ecole_etude_fac_de_pau/pierre/calcu_binaire/calcbin.cc
(Deskargatu)
#include<iostream.h>
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 compare(int* a,int* b)
{
int reta=0,retb=0;
for (int i=1;i<9;i++)
{
reta=reta+a[i]*(1<<(8-i));
retb=retb+b[i]*(1<<(8-i));
}
return reta-retb;
}
void affiche(int* tab){
cout << tab[0] << " ";
for (int i=1;i<9;i++)
{
cout << tab[i] ;
}
cout << " ";
for (int i=9;i<32;i++)
{
cout << tab[i] ;
}
cout << "\n";
}
void addition()
{
int* ptr1=conversion();
int* ptr2=conversion();
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();
}
}