我想计算一下:
0x0404cb * 2**(8*(0x1b - 3))
Run Code Online (Sandbox Code Playgroud)
以十进制表示的是:
263371*2^^(8*(27-3))
Run Code Online (Sandbox Code Playgroud)
使用| bc.
我试过了
echo 263371*2^^(8*(27-3)) | bc
expr 263371*2^^(8*(27-3)) | bc
zsh: no matches found: 263371*2^^(8*(27-3))
Run Code Online (Sandbox Code Playgroud)
或尝试解决此问题
238348 * 2^176^
Run Code Online (Sandbox Code Playgroud)
我可以一次解决吗?
bc"权力"运营商是^.您还必须引用所有内容以防止shell尝试执行历史替换和路径名扩展或将括号解释为子shell这样的操作:
$ bc <<< '263371*2^(8*(27-3))'
1653206561150525499452195696179626311675293455763937233695932416
Run Code Online (Sandbox Code Playgroud)
如果要从头开始处理初始表达式,可以使用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^^}"
Run Code Online (Sandbox Code Playgroud)
或者,而不是使用参数扩展,使用(GNU)sed更紧凑,更易读:
sed 's/\*\*/^/g;s/0x//g;s/.*/\U&/;s/^/ibase = 16; /' <<< "$eqn" | bc
Run Code Online (Sandbox Code Playgroud)