【问题标题】:How to find values 2 exponential in shell?如何在shell中找到值2指数?
【发布时间】:2018-08-01 07:02:18
【问题描述】:

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

例如,如果我输入 512,它的输出结果应该是 9,意思是 2 ^ 9 是 512。

非常感谢这里的任何帮助 - 谢谢

【问题讨论】:

  • 输入可以是任何值,还是您已经确定它是 2 的幂?
  • 换句话说:如何计算以2为底的对数。

标签: bash shell


【解决方案1】:

当我阅读问题时,512 是输入,9 是输出。有可能这里要问的是“log_base_2(512)”的答案,它的答案是“9”。如果是这样,那么也许这会有所帮助。

$ echo "l(512) / l(2)" | bc -l
9.00000000000000000008

数学的解释可以在这里找到:

How do I calculate the log of a number using bc?

【讨论】:

    【解决方案2】:

    使用awk

    $ echo 512 | awk '{print log($1)/log(2)}'
    9
    

    将其放入脚本 (expo.sh):

    #!/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
    

    【讨论】:

    • awk -v a=512 'BEGIN{print log(a)/log(2)}'
    【解决方案3】:

    检查数字 x 是 2 指数的快速方法是按位检查 xx-1 并排除 0、x>0

    ((x>0 && ( x & x-1 ) == 0 )) && echo $x is a 2-exponent
    

    使用这个algorithm: fast-computing-of-log2-for-64-bit-integers 来计算 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"
    

    【讨论】:

    • 谢谢@stephen
    • 谢谢@iamuser,它帮助了:-)
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多