Is there a printf converter to print in binary format?

前端 未结 30 2692
盖世英雄少女心
盖世英雄少女心 2020-11-21 06:20

I can print with printf as a hex or octal number. Is there a format tag to print as binary, or arbitrary base?

I am running gcc.

printf(\"%d %x %o         


        
30条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-21 06:56

    Quick and easy solution:

    void printbits(my_integer_type x)
    {
        for(int i=sizeof(x)<<3; i; i--)
            putchar('0'+((x>>(i-1))&1));
    }
    

    Works for any size type and for signed and unsigned ints. The '&1' is needed to handle signed ints as the shift may do sign extension.

    There are so many ways of doing this. Here's a super simple one for printing 32 bits or n bits from a signed or unsigned 32 bit type (not putting a negative if signed, just printing the actual bits) and no carriage return. Note that i is decremented before the bit shift:

    #define printbits_n(x,n) for (int i=n;i;i--,putchar('0'|(x>>i)&1))
    #define printbits_32(x) printbits_n(x,32)
    

    What about returning a string with the bits to store or print later? You either can allocate the memory and return it and the user has to free it, or else you return a static string but it will get clobbered if it's called again, or by another thread. Both methods shown:

    char *int_to_bitstring_alloc(int x, int count)
    {
        count = count<1 ? sizeof(x)*8 : count;
        char *pstr = malloc(count+1);
        for(int i = 0; i>(count-1-i))&1);
        pstr[count]=0;
        return pstr;
    }
    
    #define BITSIZEOF(x)    (sizeof(x)*8)
    
    char *int_to_bitstring_static(int x, int count)
    {
        static char bitbuf[BITSIZEOF(x)+1];
        count = (count<1 || count>BITSIZEOF(x)) ? BITSIZEOF(x) : count;
        for(int i = 0; i>(count-1-i))&1);
        bitbuf[count]=0;
        return bitbuf;
    }
    

    Call with:

    // memory allocated string returned which needs to be freed
    char *pstr = int_to_bitstring_alloc(0x97e50ae6, 17);
    printf("bits = 0b%s\n", pstr);
    free(pstr);
    
    // no free needed but you need to copy the string to save it somewhere else
    char *pstr2 = int_to_bitstring_static(0x97e50ae6, 17);
    printf("bits = 0b%s\n", pstr2);
    

提交回复
热议问题