Bash 如何在shell中找到2个指数值?

Bash 如何在shell中找到2个指数值?,bash,shell,Bash,Shell,有没有办法在bash中找到值的2指数形式 例如,如果我输入512,它的输出结果应该是9,这意味着2^9是512 非常感谢您的帮助-谢谢检查数字x是2指数的一种快速方法是按位检查x和x-1,并排除0,x>0 使用它来计算log2 tab32=( 0 9 1 10 13 21 2 29 11 14 16 18 22 25 3 30 8 12 20 28 15 17 24 7 19 27 23 6 26 5 4 31 ) log2_32(

有没有办法在bash中找到值的2指数形式

例如,如果我输入512,它的输出结果应该是9,这意味着2^9是512


非常感谢您的帮助-谢谢

检查数字x是2指数的一种快速方法是按位检查x和x-1,并排除0,x>0

使用它来计算log2

tab32=( 0  9  1 10 13 21  2 29
       11 14 16 18 22 25  3 30
        8 12 20 28 15 17 24  7
       19 27 23  6 26  5  4 31 )


log2_32() {
    local value=$1
    (( value |= value >> 1 ))
    (( value |= value >> 2 ))
    (( value |= value >> 4 ))
    (( value |= value >> 8 ))
    (( value |= value >> 16 ))
    log2_32=${tab32[(value * 16#7C4ACDD & 16#ffffffff)>>27]}
}

log2_32 262144 
echo "$log2_32"

当我阅读问题时,512是输入,9是输出。有可能,这里询问的是log_base_2512的答案,答案为9。如果是这样的话,也许这会有所帮助

$ echo "l(512) / l(2)" | bc -l
9.00000000000000000008
数学解释可在此处找到:

使用awk

将其放入脚本expo.sh:

运行:


输入可以是任何值,或者您已经确定它是2的幂吗?换句话说:如何计算以2为底的对数。或者awk-va=512“BEGIN{print loga/log2}”谢谢@stephenThank you@iamuser,它有助于:-
$ echo "l(512) / l(2)" | bc -l
9.00000000000000000008
$ echo 512 | awk '{print log($1)/log(2)}'
9
#!/bin/bash

_num="$1"
expon=$(awk -v a="$_num" 'BEGIN{print log(a)/log(2)}')
if [[ $expon =~ ^[0-9]+\.[0-9]*$ ]]; then # Match floating points
    echo "$_num is not an exponent of 2"; # Not exponent if floating point
else 
    echo "$_num = 2^${expon}"; # print number
fi
$ ./expo.sh 512
512 = 2^9
$ ./expo.sh 21
21 is not an exponent of 2