C 的标准 printf 函数不直接支持 %b 这样的二进制格式说明符,但是有一些变通方法可以实现这个功能。通过循环和位操作打印整数的二进制格式。这种方法适用于所有平台,不依赖于任何非标准库。

1、自定义函数打印二进制格式

由于 printf 不支持 %b 来打印二进制格式,可以编写一个自定义函数来打印整数的二进制表示。

#include <stdio.h>

void print_binary(unsigned int n) {
    for (int i = sizeof(n) * 8 - 1; i >= 0; i--) {
        putchar((n & (1 << i)) ? '1' : '0');
    }
    putchar('\n');
}

int main() {
    unsigned int num = 5;
    print_binary(num);  // 输出: 00000000000000000000000000000101
    return 0;
}

2、使用 printf 和位掩码

如只打印有效位(忽略前导零),可以使用以下方法。

#include <stdio.h>

void print_binary(unsigned int n) {
    int i;
    int leading_zero = 1;
    for (i = sizeof(n) * 8 - 1; i >= 0; i--) {
        int bit = (n >> i) & 1;
        if (bit == 1) {
            leading_zero = 0;
        }
        if (!leading_zero) {
            printf("%d", bit);
        }
    }
    if (leading_zero) {
        printf("0");
    }
    printf("\n");
}

int main() {
    unsigned int num = 5;
    print_binary(num);  // 输出: 101
    return 0;
}

3、使用 C++ 中的 std::bitset

如在使用 C++,可以使用 std::bitset 类,它直接提供了打印二进制格式的方法。

#include <iostream>
#include <bitset>

int main() {
    int num = 5; 
    // 创建一个 32 位的数字表示
    std::bitset<32> b(num);  
    // 输出: 00000000000000000000000000000101
    std::cout << b << std::endl;  
    return 0;
}

4、使用 itoa 函数(非标准)

一些平台提供了非标准的 itoa() 函数,它可以用来将整数转换为不同进制的字符串,包括二进制。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num = 5;
    char binary[33];  // 用于存储二进制字符串的数组
    itoa(num, binary, 2);  // 转换为二进制(基数 2)
    printf("%s\n", binary);  // 输出: 101
    return 0;
}