Dec-binaire: 1 ligne!

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 723 fois - Téléchargée 32 fois

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

Ajouter un commentaire

Commentaires

yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
Pourquoi ne pas rajouter la version avec complément à deux ? Pour avoir les représenations des négatifs aussi.
Pour bypasser la récursion faire

static bool neg = false;
static int param = n;
si param < 0
si neg = false;
neg = true
inverser tous les bits de param avec not (~)
rajouter 1 à ce résultat (complément à 2)
fin si
ton code avec param
fin si
else
code normal avec n positif
fin
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
JCDjcd, tu sais bien que je ne me prends pas pour la SERNAM.
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2
Heu ... bof bof :
sizeof(int)*CHAR_BIT pour etre le plus protable possible !
JackosKing
Messages postés
168
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 avril 2005

oups... :p
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
sizeof(int)*8

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.