bonjour,
commen afficher un nombre en binaire avec printf?
decimal c'est %d ..... et pour le binaire?
bonjour,
commen afficher un nombre en binaire avec printf?
decimal c'est %d ..... et pour le binaire?
voici une fonction:
puis printf("%d",dtobin(ton_nombre_allant_de_0_à_255));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 unsigned int dtobin(unsigned char h) { double n; unsigned int b=0; for(n=0;n<=7;n++) { b+=(pow(10,n)*(h%2)); h/=2; } return b; }
[Balises CODE ajoutées par Anomaly - Merci d'y penser à l'avenir]
Elle a le mérite de ne pas utiliser pow, ni de modulo, mais seulement des opérations bit à bit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void affichebin(unsigned n) { unsigned bit = 0 ; unsigned mask = 1 ; for (int i = 0 ; i < 32 ; ++i) { bit = (n & mask) >> i ; printf("%d", bit) ; mask <<= 1 ; } }
Autre avantage : elle traite tous les entiers (donc ceux > 255 aussi!)
@bakonu: Ça, c'est du vrai Binaire Codé Décimal!![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 char* strbin(const unsigned int n, const short nbBits ) { unsigned bit = 0 ; unsigned mask = 1 ; char* buffer = calloc( nbBits + 1, sizeof( char ) ); int i; for (i = 0 ; i < nbBits ; ++i) { bit = (n & mask) >> i ; buffer[ nbBits - 1 - i ] = (char)('0' + bit); mask <<= 1 ; } buffer[nbBits] = '\0'; return buffer; }
Salut,
Bakonu, ta fonction ne passe pas mes tests unitaires sauf erreur. Je l'ai modifiée pour ne pas inclure math, et elle passe les tests, ce que je ne m'explique d'ailleurs pas .Super idée, le Binaire Codé Décimal!
A+
Pfeuh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <stdlib.h> #include <stdio.h> #include <assert.h> unsigned int dtobin(unsigned char rawvalue) { unsigned int tempvalue = 0; unsigned int weight = 1; unsigned int counter = 0; while(counter < 8) { tempvalue += weight * (rawvalue % 2); rawvalue >>= 1; weight *= 10; counter++; } return tempvalue; } int main(void) { assert(dtobin(0) == 0); assert(dtobin(1) == 1); assert(dtobin(3) == 11); assert(dtobin(128) == 10000000); assert(dtobin(129) == 10000001); assert(dtobin(131) == 10000011); assert(dtobin(255) == 11111111); return 0; }
Convertir en binaire, ce n'est quand même pas très difficile. Tous les outils de manipulation de bits sont déjà proposés par le C. Nul besoin de passer par les fonctions de la lib mathématique.
Voici encore une petite routine qui utilise un buffer statique, donc sans allocation/libération, mais qui n'est pas réentrante ni thread-safe. Elle tient en quatre lignes :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 char * bin (unsigned long int i) { static char buffer [1+sizeof (unsigned long int)*8] = { 0 }; char *p=buffer-1+sizeof (unsigned long int)*8; do { *--p = '0' + (i & 1); i >>= 1; } while (i); return p; }
Elle a l'avantage de ne pas renvoyer de zéros non-significatifs, d'afficher quand même le 0 quand le nombre est nul, et d'allouer automatiquement à la compilation l'espace nécessaire et suffisant pour représenter un type long int quelque soit la plate-forme.
Et donc :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include <stdio.h> int main (void) { printf ("240 s'écrit %s en binaire.\n",bin(240)); return 0; }
Partager