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

问题描述 投票:2回答:3

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

例如,如果我输入512,则结果输出为9表示2 ^ 9为512。

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

bash shell
3个回答
1
投票

使用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

3
投票

当我读到这个问题时,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?


0
投票

检查数字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"
© www.soinside.com 2019 - 2024. All rights reserved.