如何通过printf打印二进制数

48

可能是重复问题:
有没有一个 printf 转换器可以以二进制格式打印?

这是我的程序

#include<stdio.h>
int main ()
{
    int i,a=2;
    i=~a;
    printf("a=%d\ni=%d\n",a,i);

    return 0;
}

输出结果为

a=2
i=-3

我希望这个以二进制输出。在printf中,有%x、%o和%d用于16进制、8进制和10进制数字的输出,但是用于二进制输出的是什么?


6
有没有可以输出二进制格式的printf转换器? - cnicutar
2
你真的需要二进制吗?十六进制通常同样好(甚至更好),因为它将每4位映射到一个十六进制数字,为您提供了二进制数据的紧凑且表达丰富的表示。 - Kerrek SB
3
@Kerrek,你真的在说以二进制表示一个数字是无用的吗?试着分析一下十六进制位上的浮点数吧 :P - Vinicius Kamakura
2
@hexa:没错,我一直在这样做。我为长双精度写了一个ULP比较器,我很高兴能够用十六进制进行调试。十六进制确实只是稍微压缩了一下的二进制。 - Kerrek SB
1
二进制可以用于查看位运算内存映射的设置,如果它们有适当的文档记录,并且您想以与文档中相同的方式查看值。让我们不要因为某人希望以最适合其需求的任何格式获取数据而挑剔他们。 - C.D.H.
显示剩余2条评论
2个回答

59

printf() 本身不直接支持该功能,您需要创建自己的函数。

可以尝试类似以下的实现:

while (n) {
    if (n & 1)
        printf("1");
    else
        printf("0");

    n >>= 1;
}
printf("\n");

99
这会将二进制表示反向打印。 - David Heffernan
1
@hexa 制作函数并使用递归来纠正打印顺序,这会有帮助吗? - kapilddit
轮廓转换不能在复杂的printf()中多次使用,也不是高效的(多次调用printf)。这里有一个标准和通用的解决方案:https://dev59.com/dHVD5IYBdhLWcg3wBm5h#31660310 - luart
针对正确的顺序使用和任何类型使用:template void print_binary(T n) { int numbits = sizeof(T) * 8; while(--numbits >= 0) printf("%c", (n & ((T)1<仅适用于C语言,使用硬编码数据类型,将所有“T”替换为例如“int”。 - brita_
如果n不是无符号整数,这个循环将会一直打印。 - choppe
显示剩余4条评论

53

虽然 ANSI C 没有这种机制,但可以使用 itoa() 作为快捷方式:

char buffer[33];
itoa(i, buffer, 2);
printf("binary: %s\n", buffer);

来源:{{link1:itoa()在cplusplus参考中}}

这不是标准的C语言,但K&R在C语言书中提到了它的实现,所以它应该相当常见。它应该在stdlib.h中。


2
如果<stdlib.h>/<cstdlib>无法正常工作,这里有一个快速的自行实现方法@http://www.strudel.org.uk/itoa。 - evandrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接