在bash中舍入到最接近2的幂

时间:2015-11-11 20:17:57

标签: bash shell math scripting arithmetic-expressions

我是shell脚本,我想将给定的整数舍入到最接近的2的幂。我们可以使用linux命令行中提供的任何标准工具。你可以假设bash。因此可以使用算术扩展和bc。

在对数刻度上舍入到最接近的2的幂(不是shell脚本):

r = 2^(round(log2(x)));

想象一下输入函数和输出如下:

# power2 11
8
# power2 12
16
# power2 13
16
# power2 16
16

我不确定我们是否可以通过bash shell脚本向我们提供日志。我们有圆吗?不确定。

但我知道你非常聪明,可以提出一个优雅而令人印象深刻的解决方案。

4 个答案:

答案 0 :(得分:4)

使用此功能:

$ power2 11
8
$ power2 12
16
$ power2 13
16
$ power2 16
16
$ power2 63
64

实施例

echo

如何运作

bc语句创建一个x=l($1)/l(2)将解释为命令的字符串。命令包括以下内容:

  • x

    这会将l($1)设置为第一个参数l(2)的自然日志的值,除以2的自然对数scale=0

  • scale

    通过将2^((x+0.5)/1)设置为0,将来的分割将截断为整数。

  • (x+0.5)/1

    表达式x @using (Html.BeginForm("yourmethodname", "yourcontrollername", new { id = "FilterClick" }, FormMethod.post,null )) { <input type="submit" class="smallbutton" id="FilterClick" value="Filter" /> } 舍入为最接近的整数。然后我们将结果提升到权力2。

答案 1 :(得分:0)

这个怎么样?此方法依赖于位移,直到您到达最后1位,该位位于原始数字最接近的位置(或1-off)。不需要bc的知识,只需简单的移位。所以按位,1001000最接近1000000或10000000,你只需要找到最接近的。

#!/bin/sh
ORIG=$1
A=$1
C=1
while [ $A -ne 1 ]; do
  A=$((A>>1))
  C=$((C<<1))
done
NEXT=$((C<<1))
DIFF1=$((ORIG-C))
DIFF2=$((NEXT-ORIG))
if [  "$DIFF1" -ge "$DIFF2" ]; then
  echo "$NEXT"
else
  echo "$C"
fi

答案 2 :(得分:0)

您需要使用bc。计算17的基数2,

X=17

logresult=$( echo "l($x)/l(2)" | bc -l )

[答案= 4.08746284125]

舍入,

roundresult=$( echo "($logresult+0.5)/1" | bc )

[答案= 4]

幂,

echo "2^$roundresult" | bc -l

[答案= 16]

将它们放在bash脚本中,

#!/bin/bash x=$1 logresult=$( echo "l($x)/l(2)" | bc -l ) roundresult=$( echo "($logresult+0.5)/1" | bc ) echo "2^$roundresult" | bc -l

运行此,

./script.sh 17

16

答案 3 :(得分:0)

只是为了增加另一种可能性:

power2() {
    local x=${1#-} n=1
    while ((n<x)); do ((n*=2)); done
    x=$((3*n>4*x?n/2:n))
    echo $(($1<0?-x:x))
}

也可以使用0和负数。如果未设置第一个参数或未超出整数限制的数字或数字(可能存在无限循环),则未指定结果。如果您使用此功能,请确保您真正控制输入。除此之外,它是纯粹的Bash。我的想法是找到2的幂(比如 n ),使得输入(比如 x )满足 n / 2&lt; x ≤n然后找到 n n / 2中哪一个最接近x。