| 12
 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