我是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脚本向我们提供日志。我们有圆吗?不确定。
但我知道你非常聪明,可以提出一个优雅而令人印象深刻的解决方案。
答案 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。