Linux printf将十进制转换为二进制?

时间:2018-08-25 13:51:02

标签: linux printf

在Linux中分别使用printf%x格式说明符,使用%o函数将十进制数转换为十六进制或十进制非常容易。

user@linux:~$ file /usr/bin/printf
/usr/bin/printf: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0
user@linux:~$ 

user@linux:~$ printf "Dec to Hex = %x\n" 255
Dec to Hex = ff
user@linux:~$ 

user@linux:~$ printf "Dec to Oct = %o\n" 255    
Dec to Oct = 377
user@linux:~$ 

我正在尝试将类似的十进制数字转换为二进制,但是它不起作用

user@linux:~$ printf "Dec to Bin = %b\n" 255    
Dec to Bin = 255
user@linux:~$ 

在Linux中是否可以使用printf函数将Dec转换为Bin?

Linux printf还能完成什么(数字转换)?

十六进制到十进制?十六进制到八进制?十六进制转换成二进制?

2 个答案:

答案 0 :(得分:1)

用printf找不到方法。 您可以改用dc。

template <typename T,
          typename Distribution = typename std::conditional_t<
              std::is_integral<T>::value, 
              std::uniform_int_distribution<T>,
              std::uniform_real_distribution<T>>>
auto get_right_distribution(const T a, const T b) {
    return Distribution(a, b);
}

dec到bin = 11111111

答案 1 :(得分:0)

  

在Linux中是否可以使用printf函数将Dec转换为Bin?

否,C printf没有用于二进制格式化的格式修饰符( http://www.cplusplus.com/reference/cstdio/printf/,而linux util printf也没有对其进行扩展(%b“在相应参数中扩展反斜杠转义序列” ) 。 printf工具可能仍被您的特定shell所掩盖,最终可能会添加更多格式化程序,然后您必须检查shell的手册(例如bash does extend it somewhat,但仍然没有“二进制”格式化程序)。

  

Linux printf还能完成什么(数字转换)?

     

十六进制到十进制?十六进制到八进制?十六进制转换成二进制?

它应支持常见的C格式输入(即0xN用于十六进制输入,0N用于八进制输入),例如:

$ printf "%d %d %#x %#o\n" 0x10 010 16 8
16 8 0x10 010

是的,通过使用所需的输入格式和输出格式,基本上可以将十进制/十六进制/八进制转换为十进制/十六进制/八进制任意组合。

您实际上是在思考错误,它是将输入单独转换为二进制,然后将二进制转换为输出,即,当您将“ 16”作为printf的参数值时,它将作为字符串传递给工具,然后它将解析按值分析器的字符串,检测到“ 16”是十进制格式,将其转换为本地整数值16(即CPU内部的二进制),然后最终将根据格式字符串中的格式说明符将其转换回字符串,即“ %#x“将产生该内部(二进制)整数值(” 0x10“)的十六进制格式。

如果您想让自己的“二进制”输出检查该值,那么经验丰富的汇编程序员就不用理会了,他们学会了每个单独的位读取十六进制,因为在十六进制中,每个数字正好由4位组成(0000 = 0x0,0001 = 0x1,...,1110 = 0xE,1111 = 0xF),因此通过使用十六进制格式,您可以轻松读取感兴趣的任何特定位。虽然真正的二进制输出通过直接显示0/1使其更容易一些,但是由于32位和64位值太长了,因此很难保持位置感知,但是此部分的十六进制形式较为简单(因为每两个部分数字是8位= 1个字节。