在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
还能完成什么(数字转换)?
十六进制到十进制?十六进制到八进制?十六进制转换成二进制?
答案 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个字节。