Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertir Décimal en binaire

Anonyme
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;
}
  • Partager sur Facebook
  • Partager sur Twitter
10 septembre 2010 à 22:13:43

Bonsoir, pourquoi la recuperer? tu peux l'afficher au fur et a mesure non?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 septembre 2010 à 22:17:22

non je voudrais l'afficher directement
  • Partager sur Facebook
  • Partager sur Twitter
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);

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 septembre 2010 à 22:21:54

je voudrais savoir comment récuperer cette conversion en fin de mon programme
  • Partager sur Facebook
  • Partager sur Twitter
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() :) .
  • Partager sur Facebook
  • Partager sur Twitter
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^^)
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
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)
  • Partager sur Facebook
  • Partager sur Twitter
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. ;)
  • Partager sur Facebook
  • Partager sur Twitter
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
  • Partager sur Facebook
  • Partager sur Twitter
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.
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
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.
  • Partager sur Facebook
  • Partager sur Twitter
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 :) .
  • Partager sur Facebook
  • Partager sur Twitter
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 ;)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
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 :) .
  • Partager sur Facebook
  • Partager sur Twitter
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.
  • Partager sur Facebook
  • Partager sur Twitter
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. :-°
  • Partager sur Facebook
  • Partager sur Twitter
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.
  • Partager sur Facebook
  • Partager sur Twitter
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
  • Partager sur Facebook
  • Partager sur Twitter
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. ;)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
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   j'ai oublié ce qu'on met normalement

return 0;
}

Et bonne chance.
  • Partager sur Facebook
  • Partager sur Twitter
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();
}
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

28 décembre 2018 à 2:25:47 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


13 décembre 2020 à 18:56:55

Tu devrais lire les règles du forum, avant d'aller plus loin !
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2020 à 19:00:33

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter