我可以用printf作为十六进制或八进制数打印。 是否有格式标记打印为二进制或任意基数?
我正在运行gcc。
printf("%d %x %o\n", 10, 10, 10); //prints "10 A 12\n"
print("%b\n", 10); // prints "%b\n"
#1楼
此代码应满足您最多64位的需求。 我创建了2个函数pBin&pBinFill。 两者都做同样的事情,但是pBinFill用fillChar填充前导空格。 测试功能生成一些测试数据,然后使用该功能将其打印出来。
char* pBinFill(long int x,char *so, char fillChar); // version with fill
char* pBin(long int x, char *so); // version without fill
#define kDisplayWidth 64
char* pBin(long int x,char *so)
{
char s[kDisplayWidth+1];
int i=kDisplayWidth;
s[i--]=0x00; // terminate string
do
{ // fill in array from right to left
s[i--]=(x & 1) ? '1':'0'; // determine bit
x>>=1; // shift right 1 bit
} while( x > 0);
i++; // point to last valid character
sprintf(so,"%s",s+i); // stick it in the temp string string
return so;
}
char* pBinFill(long int x,char *so, char fillChar)
{ // fill in array from right to left
char s[kDisplayWidth+1];
int i=kDisplayWidth;
s[i--]=0x00; // terminate string
do
{ // fill in array from right to left
s[i--]=(x & 1) ? '1':'0';
x>>=1; // shift right 1 bit
} while( x > 0);
while(i>=0) s[i--]=fillChar; // fill with fillChar
sprintf(so,"%s",s);
return so;
}
void test()
{
char so[kDisplayWidth+1]; // working buffer for pBin
long int val=1;
do
{
printf("%ld =\t\t%#lx =\t\t0b%s\n",val,val,pBinFill(val,so,'0'));
val*=11; // generate test data
} while (val < 100000000);
}
Output:
00000001 = 0x000001 = 0b00000000000000000000000000000001
00000011 = 0x00000b = 0b00000000000000000000000000001011
00000121 = 0x000079 = 0b00000000000000000000000001111001
00001331 = 0x000533 = 0b00000000000000000000010100110011
00014641 = 0x003931 = 0b00000000000000000011100100110001
00161051 = 0x02751b = 0b00000000000000100111010100011011
01771561 = 0x1b0829 = 0b00000000000110110000100000101001
19487171 = 0x12959c3 = 0b00000001001010010101100111000011
#2楼
C标准库中没有格式化函数来输出这样的二进制文件。 printf系列支持的所有格式操作都是针对人类可读的文本。
#3楼
一些运行时支持“%b”,尽管这不是标准。
另见这里有趣的讨论:
http://bytes.com/forum/thread591027.html
HTH
#4楼
没有标准和便携的方式。
有些实现提供itoa() ,但它不会出现在大多数情况下,并且它有一些有点糟糕的接口。 但代码在链接后面,应该让你很容易实现自己的格式化程序。
#5楼
通常,glibc中没有二进制转换说明符。
可以将自定义转换类型添加到glibc中的printf()函数系列中。 有关详细信息,请参阅register_printf_function 。 您可以添加自定义%b转换以供自己使用,如果它简化了应用程序代码以使其可用。
以下是如何在glibc中实现自定义printf格式的示例 。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3165002