Partage

Programme qui convertit de décimale en binaire

j'espère que je vais réussir à me faire comprendre ^^, car j'ai un problème

Le 24 janvier 2006 à 21:36:29

Salut à tous!
Voilà, je suis fou et j'aimerai faire un programme qui convertit un nombre (en base de dix) en un nombre binaire (base 2 ^^ ).
Bon, pour que vous compreniez mon problème, faudrait déjà que je vous explique comment fonctionne le programme, et donc la conversion de base dix en base 2!

déjà, voilà le code:
#include <stdio.h>
#include <stdlib.h>




int main(int argc, char *argv[])
{
    unsigned long nombre_decimal = 0, reponse_brut = 0, reponse_reste = 0, reponse2 = 0;

printf("Entrez un nombre : \n");
scanf ("%ld", &reponse_brut);
       
do
{     
reponse2 =  reponse_brut % 2;
printf("%ld", reponse2);
reponse_brut/=2;
 
}while (reponse_brut > 0);           
   
printf("\n");
system("PAUSE");
    return 0;
}



Alors, ceux qui connaissent bien le binaire, comprendront comment ça fonctionne (vraiment très simple, rien de spécial, faut juste y penser ^^).
Alors voilà pour ceux qui comprendraient pas (je vais pas vous expliquer comment compter en binaire, car c'est pas facile et en plus par écrit, mais je vais vous montrer comment je fais).

Alors on est d'accord que n'importe quel nombre divisé par 2 a un reste de 1 ou 0 !
Bin admettons que l'utilisateur veut convertir 4 en binaire:
Le programme cherche d'abord le reste , 4%2 ce qui vaut 0, on écrit 0 dans le printf!
Ensuite on divise 4 en faisant 4/2 = 2
donc la variable vaut 2!
On refait la meme operation (car 2 != 0 --> condition pas remplie)
-> 2 % 2 = 0
on note 0 dans le printf
et 2/2 = 1

condition pas rempli (car 1 != 0 ^^)
on recommence:
1%2 = 1
on ecrit 1 dans le printf
et 1/2 = 0
--> 0 = 0, boucle fini!

alors le printf affiche dans L'ORDRE (y a pas de saut (\n) dans le printf, donc tout s'écrit cote à cote ^^): 0 puis 0 puis 1 -> 001
mais alors que nous on veut le contraire!
on veut 100 = 4 et 001 = 2
on veut le contraire car dans un tableu des unites (tableua des unites, dizaine, centaines etc..) ce lit de droite à gauche!
mais ici le printf met dans l'ordre, donc de gauche à droite!!

Comment résoudre ce problème???


Merci d'avance :D
Publicité
Le 24 janvier 2006 à 21:36:29
Le 24 janvier 2006 à 22:07:51

Tu met le résultat binaire dans un tableau ensuite tu fais une boucle qui copie le dernier chiffre dans la premiere case d'un autre tableau,l'avant derniere dans la deuxième et ainsi de suite :D

Enfin je dis ça mais y'a surement un moyen beaucoup plus "propre" d'obtenir le résultat.
Le 24 janvier 2006 à 22:12:58

hop :
#include <stdio.h>

void binaire(int n)
{
        if (0 == n) return;
        binaire(n >> 1);
        printf("%d", (n & 1));
}

int main(void)
{
        int nombre;
        scanf("%d", &nombre);
        binaire(nombre);
        return 0;
}


Une autre version de binaire, sans opérateurs bit-à-bit, pour si vous avez du mal :
void binaire(int n)
{
        if (0 == n) return;
        binaire(n / 2);
        printf("%d", (n % 2));
}


En gros, "n >> x;" décale n de x bits vers la droite (ca revient à diviser par 2^x). L'autre opérateur est << (existent aussi >>= et <<=, vous devinez ce qu'ils font).
L'opérateur "&" fait une opération logique bit-à-bit. Il compare chaque bit du premier nombre au bit correspondant du deuxième nombre, et renvoie le résultat de l'opération logique, ici "et". (pour "ou" c'est n | 1).
n & 1 ca renvoie 1 si le dernier bit (le bit qui est au niveau du bit qui vaut 1 de 1) vaut 1, et 0 sinon (car tous les autres bit de 1 valent 0).

Pour ta question précisément, tu peux voir que j'ai utilisé une fonction récursive, ce qui est assez simple dans ton cas (je pense même que c'est la solution la plus simple).
Le 25 janvier 2006 à 12:40:12

Ok, bin merci!
Ca marche très bien mais y a un truc que je comprend pas:

La première ligne:

if (0 == n) return;


Ca veut dire: si le nombre égal à 0, arrêter la fonction?
Mais alors comment tu fais pour que la fonction se répète comme une boucle?
Je ne comprend pas trop :euh: .
En plus j'essai de comprendre les fonctions avec pointeurs, et là: ... arf! :lol:
Merci
Le 25 janvier 2006 à 13:16:33

Bon moi j'ai toujours un peu de mal avec les oppérateurs bit à bit. Donc si je comprend bien ta fonction bluestorm :

A chaque fois tu décales de un bit

Donc si en entrée on a 00101001
avec un n >> 1 on aura

00010100 Puisques le bit de poids faible vire à chaque fois non ? Donc aprés tu appelles la fonction récursivement puis d'aprés ce que je comprend une fois que tous les bits ont été décalés tu affiches n & 1 donc si au final on a exemple

10100000 avec l n & 1 on aura

10100000
00000001
=
10100001
=
2^7 + 2^5 + 2^0
=
161

Le 25 janvier 2006 à 13:40:45

Citation

10100000
00000001
=
10100001
=
2^7 + 2^5 + 2^0
=
161



Non, là tu te trompes. Pour comprendre il faut connaitre rigoureusement l'opérateur logique 'et'.

Quand on dit "Mathieu et Nicolas sont là", quand est-ce que c'est vrai ? Quand mathieu est là et nicolas est là. C'est à dire que si l'un des deux, ou les deux, sont absents, c'est faux.

On a donc un truc comme ca (Vrai et Faux) :

A | B | A et B |
V | V | V |
V | F | F |
F | V | F |
V | F | V |


Remplace V par '1' et F par '0', et applique la fonction à chacun des bits des deux nombres :

Citation

10100000 &
00000001
=
00000000
=
0



Citation

10100001 &
00000001
=
00000001
=
1

Un bit du nombre final vaut 1 uniquement quand les deux bits des deux nombres valent 1 tout les deux. De fait, "n & 1" renvoie donc la valeur du dernier bit (et équivaut donc à (n % 2)).
Le 25 janvier 2006 à 13:45:07

Ah vi oui pardon j'ai confondu avec l'opérateur logique OU autant pour moi donc pour le ET c'est

0 & 0 -> 0
0 & 1 -> 0
1 & 0 -> 0
1 & 1 -> 1

qui serait la table de véritié du ET

Programme qui convertit de décimale en binaire

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