使用 bc 从二进制转换为十六进制有困难

使用 bc 从二进制转换为十六进制有困难

我阅读了如何使用命令行计算器和此处文档进行计算,但尽管如此,我没有得到我所期望的结果,也找不到我的错误,我在 shell 中所做的是:

bc << HERE
>ibase=2
>obase=16
>1001
>HERE
100

我原本期望得到 9 作为结果,因为二进制 1001 是十六进制 9,但我得到了 100。

答案1

因为您首先设置输入基数,然后当您设置输出基数时,16 将根据输入基数 (2) 进行解释。在这种情况下, 6in似乎16被简单地解释为二进制1位,因此输出基数被设置为二进制 11 或十进制 3。

要解决此问题,您可以在设置输入基数之前设置输出基数:

echo 'obase=16; ibase=2; 1001' | bc

答案2

因为您ibase=2首先设置,所以需要使用obase=10000

$ echo 'ibase=2; obase=10000; 1001' | bc
9

答案3

[io]base=虽然您始终可以根据当前输入基数分解出声明,其他您可能要做的就是使用显式的十六进制表示法,无论输入基础如何,它都应该有效。像这样:

printf %s\\n ibase=2 obase=F 1001 | bc

...打印...

9

如果您在设置输入基数时迷失了方向,您可能会发现这特别有用,因为您始终可以轻松返回到简单的基数 10,如下所示:

ibase=A

这是标准化语法由 POSIX 强制执行:

  • ibaseobase被分配列表中的单个数字值时词汇约定在 中bc,该值应假定为十六进制。(例如,ibase=A设置为以 10 为基数,无论当前ibase值如何。)ibase否则,当输入中出现大于或等于 的值的数字时,行为未定义。和 的ibase初始obase值为 10。

这是一个历史性的大会,始于dc (在某些系统上,它bc仍然只不过是一个前端)所以...

echo 2i Fo 1001p|dc

...还打印...

9

相关内容