516 votes

Existe-t-il un convertisseur printf à imprimer en format binaire?

Je peux imprimer avec printf comme un nombre hexadécimal ou octal. Y a-t-il une balise de format à imprimer en base binaire, ou arbitraire ?

Je suis sous gcc.

323voto

William Whyte Points 1036

Hacky, mais fonctionne pour moi :

...

Pour les types de plusieurs octets

Vous devez tous les extras « s malheureusement. Cette approche a des risques de l’efficacité des macros (ne pas passer une fonction comme argument à la BYTETOBINARY), mais évite les problèmes de mémoire et plusieurs appels de strcat dans certaines autres propositions ici.

161voto

EvilTeach Points 12235

Voici un petit hack pour démontrer des techniques pour faire ce que vous voulez.

 #include <stdio.h>      /* printf */
#include <string.h>     /* strcat */
#include <stdlib.h>     /* strtol */

const char *byte_to_binary(int x)
{
    static char b[9];
    b[0] = '\0';

    int z;
    for (z = 128; z > 0; z >>= 1)
    {
        strcat(b, ((x & z) == z) ? "1" : "0");
    }

    return b;
}

int main(void)
{
    {
        /* binary string to int */

        char *tmp;
        char *b = "0101";

        printf("%d\n", strtol(b, &tmp, 2));
    }

    {
        /* byte to binary string */

        printf("%s\n", byte_to_binary(5));
    }

    return 0;
}
 

90voto

DGentry Points 10759

Il n'y a pas une conversion en binaire rédacteur de devis dans la glibc, normalement.

Il est possible d'ajouter des types de conversion pour le printf() de la famille de fonctions dans la glibc. Voir register_printf_function pour plus de détails. Vous pouvez ajouter une coutume %b de conversion pour votre propre usage, s'il simplifie le code de l'application de la disposition.

Voici un exemple de la façon de mettre en œuvre une coutume formats de printf dans la glibc.

19voto

R.. Points 93718

Voici une version de la fonction qui ne souffre pas de réentrance délivre ou limite sur la taille/type de l’argument :

Notez que ce code fonctionnerait tout aussi bien pour n’importe quelle base entre 2 et 10 si vous suffit de remplacer les 2 par la base désirée. Son utilisation est :

Où `` est une expression intégrale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X