C : Décimal => Binaire

$ Enzo $ Messages postés 359 Statut Membre -  
le hollandais volant Messages postés 5294 Statut Membre -
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 5294 Statut Membre 1 058
 
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 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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 359 Statut Membre 61
 
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 5294 Statut Membre 1 058
 
^^ bonne chance !
0
$ Enzo $ Messages postés 359 Statut Membre 61
 
//********************************************//
//* 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 5294 Statut Membre 1 058
 
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 359 Statut Membre 61
 
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 5294 Statut Membre 1 058
 
ç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 5294 Statut Membre 1 058
 
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 359 Statut Membre 61
 
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 5294 Statut Membre 1 058
 
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 980 Statut Membre 378
 
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