C : Décimal => Binaire
$ Enzo $
Messages postés
359
Statut
Membre
-
le hollandais volant Messages postés 5294 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
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
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
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
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 ^^
Quant au programme, j'y travaille toujours, ce n'est pas facile ^^
//********************************************//
//* 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
//* 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
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 :
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 :
// commentairesoit :
/* commentaire */
Si si, ça marche, j'ai testé.
Mais je l'ai fais d'une façon un peu empirique :-P
Mais je l'ai fais d'une façon un peu empirique :-P
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.
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).
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.
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 !
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 !
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
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
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;
}
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,