Is there a printf converter to print in binary format?

前端 未结 30 2748
盖世英雄少女心
盖世英雄少女心 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:54

    Is there a printf converter to print in binary format?

    The printf() family is only able to print in base 8, 10, and 16 using the standard specifiers directly. I suggest creating a function that converts the number to a string per code's particular needs.


    To print in any base [2-36]

    All other answers so far have at least one of these limitations.

    1. Use static memory for the return buffer. This limits the number of times the function may be used as an argument to printf().

    2. Allocate memory requiring the calling code to free pointers.

    3. Require the calling code to explicitly provide a suitable buffer.

    4. Call printf() directly. This obliges a new function for to fprintf(), sprintf(), vsprintf(), etc.

    5. Use a reduced integer range.

    The following has none of the above limitation. It does require C99 or later and use of "%s". It uses a compound literal to provide the buffer space. It has no trouble with multiple calls in a printf().

    #include 
    #include 
    #define TO_BASE_N (sizeof(unsigned)*CHAR_BIT + 1)
    
    //                               v. compound literal .v
    #define TO_BASE(x, b) my_to_base((char [TO_BASE_N]){""}, (x), (b))
    
    // Tailor the details of the conversion function as needed
    // This one does not display unneeded leading zeros
    // Use return value, not `buf`
    char *my_to_base(char *buf, unsigned i, int base) {
      assert(base >= 2 && base <= 36);
      char *s = &buf[TO_BASE_N - 1];
      *s = '\0';
      do {
        s--;
        *s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % base];
        i /= base;
      } while (i);
    
      // Could employ memmove here to move the used buffer to the beginning
    
      return s;
    }
    
    #include 
    int main(void) {
      int ip1 = 0x01020304;
      int ip2 = 0x05060708;
      printf("%s %s\n", TO_BASE(ip1, 16), TO_BASE(ip2, 16));
      printf("%s %s\n", TO_BASE(ip1, 2), TO_BASE(ip2, 2));
      puts(TO_BASE(ip1, 8));
      puts(TO_BASE(ip1, 36));
      return 0;
    }
    

    Output

    1020304 5060708
    1000000100000001100000100 101000001100000011100001000
    100401404
    A2F44
    

提交回复
热议问题