如何在Shell/Bash中计算数值的2的指数形式?
在Bash中获取数值的2的指数形式
当然有办法实现这个需求!如果你想输入一个2的幂数(比如512),得到对应的指数(比如9),这里有几个实用的方案,还附带了输入合法性检查,避免非2的幂数带来的错误结果:
方法1:利用对数计算(结合bc或awk)
bc是Bash里常用的计算器工具,我们可以用自然对数的换底公式来计算log₂(n):
# 以输入512为例,输出整数9 echo "scale=0; l(512)/l(2)" | bc -l # 或者用awk直接输出整数结果 echo 512 | awk '{print int(log($1)/log(2))}'
注意:如果输入的数不是2的幂,这个方法会输出小数的整数部分(比如输入10会输出3),所以最好先判断输入是否是2的幂。
方法2:位运算+循环(更严谨的整数操作)
2的幂的二进制只有一个1,利用这个特性,我们可以先判断输入是否为2的幂,再通过右移循环统计次数:
#!/bin/bash read -p "请输入一个正整数:" num # 先检查输入是否为正整数 if ! [[ "$num" =~ ^[0-9]+$ ]] || (( num <= 0 )); then echo "错误:请输入大于0的整数" exit 1 fi # 判断是否是2的幂(2的幂满足 num & (num-1) == 0,且num≠0) if (( (num & (num - 1)) != 0 )); then echo "$num 不是2的幂,无法得到整数指数" exit 1 fi # 循环右移统计指数 exponent=0 while (( num > 1 )); do num=$(( num >> 1 )) # 右移一位等价于除以2 ((exponent++)) done echo "对应的2的指数是:$exponent"
把这段代码存成脚本运行,输入512就会输出9,输入非2的幂或者负数会给出明确提示。
方法3:一行式的简洁判断+计算
如果你想要更紧凑的写法,用awk可以把判断和计算整合在一起:
echo 512 | awk '{ if ($1 <= 0) {print "请输入正整数"} else if (($1 & ($1-1)) != 0) {print $1"不是2的幂"} else {print log($1)/log(2)} }'
内容的提问来源于stack exchange,提问作者nss
相关产品推荐
相关产品推荐

