是否有printf转换器以二进制格式打印?

拟墨画扇 提交于 2020-02-27 06:42:01

我可以用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格式的示例

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!