【发布时间】:2017-09-04 11:29:14
【问题描述】:
我一直在使用一种非常基本的方法,大部分情况下是直接的,将基数为 10 的数字 {1..256} 转换为基数为 4 或四进制数的方法。我一直在使用简单的除法$(($NUM/4)) 来获得主要结果,以便获得余数$(($NUM%4)),然后反向打印余数以获得结果。我使用以下bash 脚本来执行此操作:
#!/bin/bash
NUM="$1"
main() {
local EXP1=$(($NUM/4))
local REM1=$(($NUM%4))
local EXP2=$(($EXP1/4))
local REM2=$(($EXP1%4))
local EXP3=$(($EXP2/4))
local REM3=$(($EXP2%4))
local EXP4=$(($EXP3/4))
local REM4=$(($EXP3%4))
echo "
$EXP1 remainder $REM1
$EXP2 remainder $REM2
$EXP3 remainder $REM3
$EXP4 remainder $REM4
Answer: $REM4$REM3$REM2$REM1
"
}
main
此脚本适用于数字 0-255 或 1-256。但超出这个(这些)范围,结果会变得混杂,经常重复或不准确。这不是什么大问题,因为我不打算转换超过 256 或小于 0 的数字(负数 [还])。
我的问题是:“有没有更简化的方法来做到这一点,可能使用expr 或bc?
【问题讨论】:
-
存储在数组中的查找表怎么样?使用大括号扩展很容易创建.. 0-255 比 1-256 简单
-
这会起作用,但也会让我无法将它包含在一个简单的脚本中。我只是想简化算术表达式,可能通过递归方法而不是使用先前变量值的多个变量。我很可能会越了解这个概念。
-
不确定你是否理解我的意图。这里有两行代码将十进制的 0-255 转换为 base4...
base4=({0..3}{0..3}{0..3}{0..3})和echo "${base4[34]}" -
啊,我明白了。相当聪明。完全避免使用
$(())进行转换,而是根据${base4[here]}中使用的值线性打印base4 等效值。我只是在 for 循环中尝试了这个,它是 100% 准确且非常快的。很好的主意。将您的解决方案放入答案中,我会将其标记为已回答。谢谢。
标签: bash shell math scripting arithmetic-expressions