Partage

Convertir Décimal en binaire

Le 10 septembre 2010 à 22:09:34

Bonjour à tous !

voilà, je suis un élève de bts iris et pour le cours d'informatique industriel, nous devons créer un convertisseur décimal binaire avec une boucle, ma question est comment récupérer la conversion binaire svp ?

Voila le source:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int nombreDec, reste, coefficient;
    coefficient=128;

    printf("Entrer un nombre decimal:");
    scanf("%d",&nombreDec);

    do
        {
            reste=nombreDec-coefficient;
            coefficient= coefficient/2;
        }

    while(coefficient=1);

  printf("La cnversion de %d n binaire est:\n",nombreDec);

return 0;
}
Publicité
Le 10 septembre 2010 à 22:09:34
Le 10 septembre 2010 à 22:13:43

Bonsoir, pourquoi la recuperer? tu peux l'afficher au fur et a mesure non?
Le 10 septembre 2010 à 22:17:22

non je voudrais l'afficher directement
Le 10 septembre 2010 à 22:21:54

Bonjour,

Juste en passant, je pense que tu as une boucle infinie ici :
do {

    reste = nombreDec - coefficient;
    coefficient = coefficient/2;

} while(coefficient=1);

Le 10 septembre 2010 à 22:21:54

je voudrais savoir comment récuperer cette conversion en fin de mon programme
Le 10 septembre 2010 à 22:24:52

Citation


Juste en passant, je pense que tu as une boucle infinie ici :



De plus, je doute que l'algorithme soit correct.

Sinon, ça veux dire quoi "récupérer cette conversion en fin de mon programme" ?

Dans un fichier ?

Si c'est le cas, utilise fopen(), fprintf() et fclose() :) .
Le 10 septembre 2010 à 22:42:49

Autrement, utilise la même méthode que en comptant normalement : un 31 c'est quoi?

3 x 10^1 + 1 x 10^0 = 30 + 1

en binaire 11111

1 x 2^4 + 1 x 2^3 + 1x2^2 + 1x2^1 + 1x2^0 = 16 + 8 + 4 + 2 + 1= 31

et en hexa 1F

1 x 16^1 + F(15)x 16^0 = 16 + 15

Comprends tu la logiques des bases en mathématiques?(désolé pour l'explication, je suis loin du BTS lol^^)
Le 10 septembre 2010 à 22:59:22

Sinon, on fait des division succesive par la base voulu et on retient le reste

Par exemple, 27

27/2 = 13 avec 1 en reste
13/2 = 6 avec 1 en reste
6/2 = 3 avec 0 en reste
3/2 = 1 avec 1 en reste
1/2 = 0 avec 1 en reste

27 (10) == 11011 (2)
Le 10 septembre 2010 à 23:09:03

Tu peux aussi utiliser les opérateurs bitwise :

(n & 1) donnera la valeur du dernier bit de n.
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)

Ceci dans une boucle, on peux facilement trouver la conversion binaire de n. ;)
Le 11 septembre 2010 à 23:28:05

Bonsoir,
d'abord, évites de mettre "Entrer un nombre décimal : " alors que deux lignes avant tu déclares un type int. De plus, dans le scanf, tu utilises %d donc tu attends un nombre entier ...


Sinon, si tu es très chanceux =) , tu peux essayer ce programme, je l'ai écrit quand j'étais fatigué pour le fun, il marche presque que pour zéro (petite dédicace au siteduzero ^^)


// Un programme pour les chanceux 
// Seul zéro est trouvé rapidement.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const int MAX = 1, MIN = 0;
    // Déclaration des variables
    int nombreEnt = 0, nombre_essay = 0, i = 0, n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0, n7 = 0;

    printf("Entrer un nombre entier : ");
    scanf("%d",&nombreEnt);
    printf("Conversion en cours ...");

    // Conversion en  1 octet impose une limite
    if (nombreEnt <= 256 && nombreEnt >= 0)
    {
        while(nombreEnt != nombre_essay)
        {
            i++;
            nombre_essay = (n7*2^7)+(n6*2^6)+(n5*2^5)+(n4*2^4)+(n3*2^3)+(n2*2^2)+(n1*2^1)+(n0*2^0);
            srand(time(NULL));
            if (i>1)
            {
            n0 = (rand() % (MAX-MIN+1))+MIN;
            n1 = (rand() % (MAX-MIN+1))+MIN;
            n2 = (rand() % (MAX-MIN+1))+MIN;
            n3 = (rand() % (MAX-MIN+1))+MIN;
            n4 = (rand() % (MAX-MIN+1))+MIN;
            n5 = (rand() % (MAX-MIN+1))+MIN;
            n6 = (rand() % (MAX-MIN+1))+MIN;
            n7 = (rand() % (MAX-MIN+1))+MIN;
            }

        }

    printf("\nLa conversion de %d binaire est: %d%d%d%d%d%d%d%d\n", nombre_essay, n0, n1, n2, n3, n4, n5, n6, n7);

    return 0;
    }
    else
    {
        printf("Vous n'avez pas entrer un nombre valide");
        return 1;
    }
}



Maxence11
Le 11 septembre 2010 à 23:48:30

Citation : Tosh


(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)


Citation : norme


The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the
resulting value is implementation-defined.


Donc pas de problèmes avec un entier positif, sauf erreur. :-°
Là on ne se pose pas de question, c'est toujours un "décalage logique".

Par contre, si l'opérande gauche est signée et à une valeur négative, le résultat dépend de la plateforme.

Un article intéressant.
Zeste de Savoir, le site qui en a dans le citron !
Le 12 septembre 2010 à 11:39:16

Bonjour,

Je t'ai bricolé ça en quelques minutes, à tester de façon un peu plus poussée donc, mais ça semble fonctionner :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned long u32;

int main(void)
{
    u32        nValDec = 77563214;//128340;    // < Valeur à convertir.
    u32        nMask = 1;
    u32        nIdx = 0;
    char        pStrBin[33];            // < Chaîne résultat.

    for (nIdx = 0; nIdx < 32; nIdx++, nMask <<= 1)
    {
        pStrBin[sizeof(pStrBin) - 2 - nIdx] = ((nValDec & nMask) ? '1' : '0');
    }
    pStrBin[sizeof(pStrBin) - 1] = 0;

    printf("Résultat: %d en binaire = %s\n", (int)nValDec, pStrBin);

    getchar();
    return(0);
}


Clément.
Le 12 septembre 2010 à 12:39:24

J'aime bien ton algo :) .

Je l'ai repris pour pouvoir afficher les bits de n'importe quelle variable, quelque soit son type.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned long u32;

char *conv_to_bin (void *val, size_t s)
{
   unsigned char *ptr = val;
   char *str = malloc ((s * 8) + 1);

   u32 nMask = 1;
   u32 j, i;
   for (i = 0; i < s; i++)
   {
      nMask = 1;
      for (j = 0; j < 8; j++, nMask <<= 1)
      {
         str[(s * 8) - 1 - (i * 8 + j)] = ((ptr[i] & nMask) ? '1' : '0');
      }
   }
   str[s * 8 - 1] = 0;

   return str;
}

int main (void)
{
   double a = 1.5;
   unsigned char b[4] = "ABC";
   unsigned int c = 0x00ff00ff;
   char *str;

   str = conv_to_bin (&a, sizeof (double));
   printf ("Résultat: %lf en binaire = %s\n", a, str);
   free (str);

   str = conv_to_bin (b, sizeof (unsigned char) * 4);
   printf ("Résultat: %s en binaire = %s\n", b, str);
   free (str);

   str = conv_to_bin (&c, sizeof (unsigned int));
   printf ("Résultat: %u en binaire = %s\n", c, str);
   free (str);

   return 0;
}


Vraiment pour le fun quoi :) .
Le 12 septembre 2010 à 14:20:34

Citation : Tosh

J'aime bien ton algo :) .


Moi pas trop.

Je trouve dommage d'afficher les zéros inutiles à gauche.

Il y a moyen de faire plus simple et propre, en particulier la solution récursive, est très élégante. ;)

le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.

mais bon, ça fonctionne ;)
Zeste de Savoir, le site qui en a dans le citron !
Le 12 septembre 2010 à 14:38:20

Citation

Je trouve dommage d'afficher les zéros inutiles à gauche.



Ça permet de bien se rendre compte de l'état de la variable en mémoire je trouve.

Citation

le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.



Euh, je ne trouve pas, car on a le nMask <<= 1 dans la boucle.

En gros, au lieu de parcourir tous les bytes avec var >> 1 comme je le proposais, on prends un bit de masquage, qu'on applique à chaque bit de la variable.

Je vais tester une solution récursive pour le fun :) .
Le 12 septembre 2010 à 14:59:41

Bonjour,

GurneyH :

Citation


le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.


nMask change de valeur, sinon je n'aurais pas créé une variable.

Une solution récursive utilisera plus de mémoire et sera moins rapide, et le posteur original précise bien "avec une boucle".

Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).

Clément.
Le 12 septembre 2010 à 15:32:31

Tu m'expliques le cast ici : printf("Résultat: %d en binaire = %s\n", (int)nValDec, pStrBin);
Pourquoi utiliser un unsigned dans ce cas là ? entre un nombre supérieur à 2^31 et tu vas avoir des surprises. :-°
Le 12 septembre 2010 à 15:51:37

Bonjour,

Bon, comme je l'ai dit, j'ai écrit le truc en quelque chose comme 5/10 minutes, en pensant aider.

Le cast, je l'ai mis sans trop réfléchir, juste pour ne pas avoir un warning à la compilation. D'habitude je m'en moque un peu, les printf ne me servent en général qu'à débugger.

Il n'y a qu'à caster en (unsigned), et voilà tout. Est-ce vraiment un problème ?

Clément.
Le 12 septembre 2010 à 15:55:29

Bah, oui quand même :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned long u32;

int main(void)
{
  u32        nValDec = 2147483648;
  u32        nMask = 1;
  u32        nIdx = 0;
  char        pStrBin[33];            // < Chaîne résultat.
  
  for (nIdx = 0; nIdx < 32; nIdx++, nMask <<= 1)
  {
    pStrBin[sizeof(pStrBin) - 2 - nIdx] = ((nValDec & nMask) ? '1' : '0');
  }
  pStrBin[sizeof(pStrBin) - 1] = 0;
  
  printf("Résultat: %d en binaire = %s\n", (int)nValDec, pStrBin);
  
  getchar();
  return(0);
}

Résultat: -2147483648 en binaire = 10000000000000000000000000000000
Le 12 septembre 2010 à 18:26:33

Citation : Joe78


nMask change de valeur, sinon je n'aurais pas créé une variable.


Ah, désolé pour nMask, bien sur ce n'est pas une constante.

Citation : joe78


Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).



Faut voir. ;)
Zeste de Savoir, le site qui en a dans le citron !
Le 21 novembre 2010 à 0:06:13

Salut, je suis un élève en cpge.
J'ai essayé et voilà ce que j'ai trouvé. J'ai exécuté et ça a marché:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int fin, nombreDec, reste, poids;
    poids=128;//Le poids est arbitraire on peut choisir n'importe quelle puissance de 2, ça reste un choix

    printf("Entrer un nombre decimal:");
    scanf("%d",&nombreDec);
    printf("La conversion de %d en binaire est:\n\n",nombreDec);
    
    
        do
            {
                {
                 if ((nombreDec-poids) >= 0)
                  {
                   reste=1;//Ce poids existe dans le nombreDec il est représenté par 1 en binaire
                   nombreDec=nombreDec-poids;
                  } 
                 else
                   reste =0;//Ce poids n'existe pas donc 0
                }
                
                printf("%d",reste);
                               
                poids= poids / 2;
                
            }
                
        while(poids>=1);      
       
        scanf("%d",&nombreDec);//Juste pour que la fenêtre ne se ferme pas :D  j'ai oublié ce qu'on met normalement

return 0;
}

Et bonne chance.
Le 21 novembre 2010 à 7:52:38

vive le terrage 12/09/2010 ça va encore !!
Le 21 novembre 2010 à 11:02:01

Tiens d'ailleurs hier soir je intéressais à cela, voila ce que ça donne:
#include<stdio.h>

int main(void)
{
    unsigned int n;
	unsigned long long I=0x100000000;
	
	printf("Entrer n:");
	scanf("%d",&n);
	
	unsigned int i = 0;
	for(;(n&I)?0:1;i++,I/=2);
	
	for(;i < (sizeof(n)*8);i++,I/=2)
			printf("%d",(n&I)?1:0);
	
	printf("\n");
	getchar();
	getchar();
}
Étudiant - Codeur en C                                                                                                                                                                  Copying is an act of love.    -   

Convertir Décimal en binaire

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown