我阅读了如何使用命令行计算器和此处文档进行计算,但尽管如此,我没有得到我所期望的结果,也找不到我的错误,我在 shell 中所做的是:
bc << HERE
>ibase=2
>obase=16
>1001
>HERE
100
我原本期望得到 9 作为结果,因为二进制 1001 是十六进制 9,但我得到了 100。
答案1
因为您首先设置输入基数,然后当您设置输出基数时,16 将根据输入基数 (2) 进行解释。在这种情况下, 6
in似乎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 强制执行:
- 当
ibase
或obase
被分配列表中的单个数字值时词汇约定在 中bc
,该值应假定为十六进制。(例如,ibase=A
设置为以 10 为基数,无论当前ibase
值如何。)ibase
否则,当输入中出现大于或等于 的值的数字时,行为未定义。和 的ibase
初始obase
值为 10。
这是一个历史性的大会,始于dc
(在某些系统上,它bc
仍然只不过是一个前端)所以...
echo 2i Fo 1001p|dc
...还打印...
9