C : Décimal => Binaire

Fermé
$ Enzo $ Messages postés 333 Date d'inscription jeudi 19 février 2009 Statut Membre Dernière intervention 9 janvier 2011 - Modifié par $ Enzo $ le 28/03/2010 à 15:29
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 - 3 avril 2010 à 19:03
Bonjour,

Je suis débutant en C et je voudrais savoir comment on fait un convertisseur Décimal > Binaire (et aussi Binaire > Décimal par la même occasion.)

1- Comment fait-on la conversion (avec un papier et un crayon) ?

2- Peut-on le faire sans pointeurs ? (Pas encore de mon niveau les pointeurs ^^)


3- Si oui comment puis-je procéder dans le codage ? Les étapes à suivre ?

Ça serait gentil d'éviter de me donner un code déjà tout prêt, sinon, je ne peux pas apprendre ;-)

Merci :-)




Enzo

4 réponses

le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
Modifié par le hollandais volant le 28/03/2010 à 12:13
Salut !

Pour la question 1 : voilà : http://lehollandaisvolant.net/tuto/bin/. (Et plus précisément, cette section).

La question 2 : pas besoin de pointeurs/tableaux. Il te faut :

- savoir déclarer une variable et travailler avec
- savoir récupérer une valeur saisie au clavier et la mettre dans une variable
- connaitre les boucles "while"
- connaitre les conditions "if"
(- idéalement les fonctions.)


Tu dois d'abord déterminer la puissance de 2 directement inférieur ou égale à ton nombre (avec un "if" par exemple). Je te conseille de faire une boucle (while) pour tester :

Tant que <ma puissance de deux> est inférieur à <mon nombre>
===> <ma puissance de deux> augmente d'une puissance.

Une fois qu'on est sortie de la boucle, on dispose de la puissance supérieur. Or il nous fallait celle en dessous. Soit tu gardes en mémoire la valeur précédente, soit tu divise la valeur par deux. (2^n = 2*(2^(n-1)))

Tu dispose alors de la taille de ton nombre (s'il est plus entre 512 et 256, ou entre 256 et 128, ou 128 et 64, etc).

Ensuite, tu vois qu'il faut trouver le reste des divisions de ton nombre par une puissance de deux.

Prenons 14. Le reste de la division de la plus grande puissance de 2 inférieure est 6 (la plus grande puissance de 2 étant 8 = 2^3).
Pour trouver ça, on fait bien-sur 14%8.

Enfin, tu ré-effectue cette opération sur le reste : 6%4 (4 étant la puissance de 4 directement inférieure à 6)
6%4 = 2

Puis, 2%2 (2 étant la puissance directement inférieure à 2)
2%2 = 0

On arrête ici (car le reste est nul).

Quand je dis "on ré-effectue cette fonction" et "on arrête ici", je veux parler d'une boucle while :
Tant que (le reste n'est pas nul)
calcule
fin tant que



Notre nombre binaire est : 1110 (le 1 de la puissance "8" qui est contenu dans 8, le 1 de la puissance "4" contenu aussi, puis le "1" de la puissance "2" contenu aussi, et le 0 enfin, car la puissance "1" n'est pas contenue.)


J'espère que c'est assez clair...

Matricule 18-38-4
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 mars 2010 à 23:34
Sinon, tu peux partir dans l'autre sens.
Tu divises par deux successivement et tu retiens les restes.
La conversion en binaire est alors l'inverse de l'ensemble des restes.
N'hésite pas si tu veux plus de détails.
Cdlt,
0
$ Enzo $ Messages postés 333 Date d'inscription jeudi 19 février 2009 Statut Membre Dernière intervention 9 janvier 2011 61
28 mars 2010 à 15:23
Merci, je sais désormais convertir un décimal en bit et j'ai compris le principe.
Quant au programme, j'y travaille toujours, ce n'est pas facile ^^
0
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
28 mars 2010 à 15:47
^^ bonne chance !
0
$ Enzo $ Messages postés 333 Date d'inscription jeudi 19 février 2009 Statut Membre Dernière intervention 9 janvier 2011 61
Modifié par $ Enzo $ le 28/03/2010 à 17:24
//********************************************//
//* Copyright (C) 2010, $ Enzo $ *//
//********************************************//

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

int main()
{
printf("DEC TO BIN\n\nBy $ Enzo $\n\n\nValeur decimale a convertir : ");

int nombre, b1, b2, b4, b8, b16, b32, b64, b128, b256;

scanf("%d", &nombre);

b1 = nombre % 2;
b2 = (nombre / 2) % 2;
b4 = (nombre / 4) % 2;
b8 = (nombre / 8) % 2;
b16 = (nombre / 16) % 2;
b32 = (nombre / 32) % 2;
b64 = (nombre / 64) % 2;
b128 = (nombre / 128) % 2;
b256 = (nombre / 256) % 2;


printf("\n\n%d%d%d%d%d%d%d%d%d", b256, b128, b64, b32, b16, b8, b4, b2, b1);

return 0;
}

Je n'ai pas trop réussi mais voila quelque chose qui à quand même l'air de marcher...

Je vais quand même encore essayer de faire comme dans ton post, Le Hollandais Volant ^^
Enzo
0
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
Modifié par le hollandais volant le 28/03/2010 à 17:37
je vais tester, mais si ça marche tant mieux !

Mon premier post proposait en plus de pouvoir aller au delà de 256 (le prog cherche lui même la valeur max).

Par contre, pour le "%d%d%d...%d" je sais pas si le C permet la concaténation. (coller les nombres les un aux autres (par exemple : 2 et 3 => 23.

Je ne pense pas que ce soit possible.
En revanche, si tu fais un tableau, tu peux. (ensuite, pour l'affichage, une boucle pour afficher successivement les contenues des cases du tableau.


PS : les "//" à la fin des commentaires ne sont pas obligatoire.

on fait soit :
// commentaire
soit :
/* commentaire */
0
$ Enzo $ Messages postés 333 Date d'inscription jeudi 19 février 2009 Statut Membre Dernière intervention 9 janvier 2011 61
28 mars 2010 à 17:53
Si si, ça marche, j'ai testé.
Mais je l'ai fais d'une façon un peu empirique :-P
0
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
28 mars 2010 à 17:55
ça marche, je viens de voir :)

de toute façon, je considère que y'a que le résultat qui compte^^ ensuite, c'est du "bonus" ^^
0
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
Modifié par le hollandais volant le 31/03/2010 à 17:21
RE !
J'ai fait mon code à moi, si tu veux y jeter un oeil... Ton code marche très bien, je ne me sent donc pas trop coupable de donner la correction :)

Je poste les morceaux pour pouvoir commenter un peu, il faut juste les mettre bout à bout.

/*  convertisseur simple Decimal-2-Bin.  
 *  converti en binaire des nombres jusqu'à 1 073 741 823  
 */  

#include <stdio.h>  
#include <stdlib.h>  
#define MAX 30  

int main()  
{  
 int nombre, i = 0, bin[MAX] = {0}, j;  
 printf("\n Nombre à convertir en binaire : "); scanf("%d", &nombre);  


Juste ci dessous : on part du nombre rentré et on regarde le reste de la division par deux.
exemple : 13%2 = 1.
Ensuite, on prend la moitié de 13 = 6,5 donc 6 en INT et on recommence. 6%2 = 0.
On met tout ces valeurs dans un tableau (les "1" ou "0").
Au final, le tableau bin[] contient bien le nombre en binaire, mais dans le mauvais ordre !!

(pour 4, il contient 001 et non 100).

 while (nombre != 0)  
 {  
  bin[i] = nombre % 2;  
  nombre /= 2;  
  i++;  
 }  

 printf("\n");  


ci dessous, on inverse le sens du tableau.
J'ai ajouté un "if ((j) % 4 == 1)" qui separre la suite de nombre en bloc de 4. (un peu comme en separre les nombres décimaux en bloc de 3 :

1000000 => 1 000 000.

 for (j=i; j>0; j--)  
 {  
  printf("%d", bin[j-1]);  
  if ((j) % 4 == 1)  
  {  
   printf(" ");  
  }  
 }  

 printf("\n");  

return 0;  
}  



Il y'a mainte façon de procéder, comme d'habitude, la tienne n'est pas mauvaise donc, mais utiliser une boucle a l'avantage de calculer tout seul la dimension du tableau.

Ce code permet de convertir des nombres jusqu'à 2^30 (à cause de la dimension maximale que j'ai fixé à 30 pour le nombre de cases, au moyen du "define MAX 30" au début).

voilà !
bonne continuation !
0
$ Enzo $ Messages postés 333 Date d'inscription jeudi 19 février 2009 Statut Membre Dernière intervention 9 janvier 2011 61
3 avril 2010 à 16:33
Ah, merci je vais essayer ;-)
Je n'avais pas songé aux tableaux car à vrai dire, je n'ai pas encore appris cela...
Mais tant mieux, ton code va ainsi me permettre de m'initier aux tableaux :-D
0
le hollandais volant Messages postés 4998 Date d'inscription samedi 8 mars 2008 Statut Membre Dernière intervention 23 décembre 2023 1 056
3 avril 2010 à 17:11
En ce moment même, j'essaie l'inverse : de binaire à décimal, mais c'est plus dur :/

Si tu veux un tutoriel pour apprendre le C, je peux te conseiller celui du site du zéro. Ce tuto est une référence en la matière.

Tout est simple et complet : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
3 avril 2010 à 17:44
pour faire l'inverse, tu peux essayer cela:
#include<stdio.h>
#include <string.h>
#define MAX 20
int main()
{
 int mask=1;
 int nbr=0;
 char tb[MAX];
 printf("Entrer un nb: \n");
 scanf("%s",tb);
 int max=strlen(tb);
while(max-->=0){
      nbr+=(tb[max]=='1'?mask:0);
      mask<<=1;
}
printf("%d",nbr);
getchar();
return 0;
}
0