Dec-binaire: 1 ligne!

Contenu du snippet

Afficher l'équivalent binaire d'un nombre en une ligne.

Voici sans doute la source la plus simple (la plus rapide?) pour convertir un nombre décimal en binaire.
Considérons par exemple le nombre décimal 43.
Il s'écrit "0 0 1 0 1 0 1 1" en binaire (sur 8 bits)

43/2 = 21 (en entier).
21 s'écrit "0 0 0 1 0 1 0 1" sur le même nombre de bits.

Vous pouvez remarquer que tous les bits ont été décalés vers la droite, c'est le principe de la divison par 2.
0 0 1 0 1 0 1 1 = 43
0 0 0 1 0 1 0 1 = 43/2 = 21
0 0 0 0 1 0 1 0 = 43/2/2 = 21/2 = 10

etc.

Il suffit donc de diviser par deux jusqu'à ce qu'on arrive au nombre 0 pour que tous les bits passent à la position de droite. Mais nous voulons que le bit de gauche soit affiché en 1°. Il faudra donc d'abord tout diviser avant de commencer à afficher.

Nous devons également utiliser un masque. Le masque 1, qui s'écrit "0 0 0 0 0 0 0 1" en binaire sur 8 bits, nous servira à extraire le bit de droite d'un nombre.

on fait une opération "et" sur chaque bit. Cette opération renvoie 1 si les deux chiffres sont à 1.

0 0 1 0 1 0 1 1
& 0 0 0 0 0 0 0 1
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
0 0 0 0 0 0 0 1

On aura donc en résultat du masque le bit de droite, tous les autres étant mis à zéro.

Notre algorithme sera donc:

Procédure binaire (n: entier) {
si n est différent de 0 alors rappeler binaire (n / 2) et afficher (n & 1) }

le décalage des bits se fait lors de l'appel récursif, l'affichage lors du retour.
n différent de 0 est la condition de sortie, pour éviter une boucle infinie.

Effets de bord : si vous faites binaire(0), n'affiche rien.
Pour afficher un 0 devant tous les chiffres, il faut sortir l'affichage de la condition "if".

Avec un nombre négatif : Binaire(-n) a le même effet que binaire (n).

J'espère que vous avez compris.

Source / Exemple :


void Dec2Bin(int n){

if(0!=n) {Dec2Bin(n/2); printf("%1d",n & 1); }

}

//pour toujours mettre un zéro avant : 

void Dec2Bin(int n){

if(0!=n) {Dec2Bin(n/2);} printf("%1d",n & 1); 

}

// sur une ligne :

void Dec2Bin(int n){if(0!=n) {Dec2Bin(n/2);} printf("%1d",n & 1); }

Conclusion :


des commentaires?

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.