1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include <stdio.h>
#include <stdlib.h>
#define NB_BITS 17
#define VAL_BIT(i_nb, i_indice_bit) ((i_nb>>i_indice_bit)&1)
/**récuperer dans une chaine de caractere la representation
binaire i_N-bits d'un nombre passé en param.
ch doit avoir au moins i_N+1 caracteres**/
void int_to_bin(const int i_N, char *c_ch, const int i_nb){
int i,j=0;
for (i=i_N-1; i>=0; i--) c_ch[j++]= ( ((i_nb>>i)&1 )==0 ) ? '0' : '1' ;
c_ch[j]='\0';
}
int main (void) {
int i_cpt;
int i_acces;
char c_aff[33]; /* 32 bits + fin de chaine*/
float f_tab_conversion[NB_BITS];
float f_res=0;
/*init tableau de conversion*/
f_tab_conversion[0]=45.0;
for (i_cpt=1; i_cpt<NB_BITS; i_cpt++)
f_tab_conversion[i_cpt]=f_tab_conversion[i_cpt-1]/2.0;
/* i_conv est l'entier à convertir */
int i_conv= (1<<31)|(1<<27)|(1<<22);
/* affichage de la representation binaire */
int_to_bin(32, c_aff, i_conv);
printf("A convertir : %d = \"%s\"\n",i_conv, c_aff);
/* on enleve le complément à deux */
char c_inv=0;
/* complément à deux : on parcourt de droite à gauche.
On garde le 1er bit à 1 inchangé, et on inverse tous les bits qui suivent */
for (i_cpt=0; i_cpt<32; i_cpt++)
{
if ( c_inv==0 && VAL_BIT(i_conv,i_cpt)==1 )
{
c_inv=1;
continue;
}
if (c_inv == 1)
{
if ( VAL_BIT(i_conv,i_cpt)==1 )
/* forcage du bit i_cpt à 0 */
i_conv &= ~(1<<i_cpt);
else
/* forcage du bit i_cpt à 1 */
i_conv |= (1<<i_cpt);
}
}
/* affichage de la representation binaire */
int_to_bin(32, c_aff, i_conv);
printf("Apres avoir enlever complement a deux : %d = \"%s\"\n",i_conv, c_aff);
/* On calcule la valeur : */
for (i_cpt=1; i_cpt<NB_BITS+1; i_cpt++)
{
i_acces = 32-i_cpt-1;
if ( VAL_BIT(i_conv,i_acces)==1 )
{
f_res += f_tab_conversion[i_cpt-1];
}
}
printf("Angle trouvé : %f\n",f_res );
return EXIT_SUCCESS;
} |
Partager