在bash中使用bc计算幂的幂

4

我想计算这个:

0x0404cb * 2**(8*(0x1b - 3))

这在十进制中是:

263371*2^^(8*(27-3))

使用| bc

我尝试使用

echo 263371*2^^(8*(27-3)) | bc
expr 263371*2^^(8*(27-3)) | bc
zsh: no matches found: 263371*2^^(8*(27-3))

或者尝试解决这个问题。
238348 * 2^176^

我能一次性解决吗?


引用字符串?? - hek2mgl
echo "263371*2^^(8^(27-3))" | bc (standard_in)1:解析错误 - monkeyUser
1
bc不理解^^。这是什么意思? - hek2mgl
1
为什么是“幂的幂”?只有当涉及到幂时才会出现,不是吗? - Benjamin W.
1
@hek2mgl bc是一款任意精度计算器,这意味着除了内存限制外,没有其他限制。 - phuclv
显示剩余10条评论
1个回答

8

bc 中的“power of”运算符是 ^。为了防止 shell 尝试执行历史替换和路径名扩展,或将括号解释为子 shell,您还需要引用所有内容:

$ bc <<< '263371*2^(8*(27-3))'
1653206561150525499452195696179626311675293455763937233695932416

如果您想从头开始处理初始表达式,可以使用ibase特殊变量将输入设置为十六进制,并进行一些额外的处理。
eqn='0x0404cb * 2**(8*(0x1b - 3))'

# Replace "**" with "^"
eqn=${eqn//\*\*/^}

# Remove all "0x" prefixes
eqn=${eqn//0x}

# Set ibase to 16 and uppercase the equation
bc <<< "ibase = 16; ${eqn^^}"

或者,不使用参数扩展,而是使用更简洁但不够易读的(GNU) sed:

sed 's/\*\*/^/g;s/0x//g;s/.*/\U&/;s/^/ibase = 16; /' <<< "$eqn" | bc

2
同时,十六进制数也可以转换为十进制数 bc <<< 'ibase=16;x=404CB;y=1B;ibase=10;x*2^(8*(y-3))' - Nahuel Fouilleul
2
@NahuelFouilleul 不错的观点。由于8在二进制和十进制中是相同的,我们可以将ibase设置为16并将输出保留为十进制,我会添加这个。 - Benjamin W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接