Bash 如何使此按位代码更简洁?

Bash 如何使此按位代码更简洁?,bash,shell,bit-manipulation,Bash,Shell,Bit Manipulation,我的按位代码是: #!/bin/bash -e random=$((RANDOM % 32)); bitWiseAnd() { local IFS='&' printf "%s\n" "$(( $* ))" } echo "random=${random}"; if [ $(bitWiseAnd ${random} "0x10") -ne 0 ]; then echo "1" else echo "0" fi if [ $(bitWiseAnd

我的按位代码是:

#!/bin/bash -e

random=$((RANDOM % 32));

bitWiseAnd() {
    local IFS='&'
    printf "%s\n" "$(( $* ))"
}

echo "random=${random}";

if [ $(bitWiseAnd ${random} "0x10") -ne 0 ]; then
    echo "1"
else
    echo "0"
fi

if [ $(bitWiseAnd ${random} "0x8") -ne 0 ]; then
    echo "1"
else
    echo "0"
fi

if [ $(bitWiseAnd ${random} "0x4") -ne 0 ]; then
    echo "1"
else
    echo "0"
fi

if [ $(bitWiseAnd ${random} "0x2") -ne 0 ]; then
    echo "1"
else
    echo "0"
fi

if [ $(bitWiseAnd ${random} "0x1") -ne 0 ]; then
    echo "1"
else
    echo "0"
fi
上述代码的示例输出:

random=15
0
1
1
1
1

我不知道这个代码是如何工作的。此代码是否可以变得更简洁?

您可以使用
for
循环,而不是重复
if
块。此外,for循环更清楚地说明了您的目的,如下所示:

#!/bin/bash -e

bitWiseAnd() {
  local IFS='&'
  printf "%s\n" "$(( $* ))"
}

random=$((RANDOM % 32));
echo "random=${random}";
for i in 10 8 4 2 1; do
  if [ $(bitWiseAnd ${random} "0x$i") -ne 0 ]; then
    echo "1"
  else
    echo "0"
  fi
done
输出:

random=10
0
1
0
1
0

还有,下面的函数

bitWiseAnd() {
    local IFS='&'
    printf "%s\n" "$(( $* ))"
}
可以通过这种方式更加明确,只要我们只看两个输入参数:

bitWiseAnd() {
  printf "%s\n" $(($1 & $2))
}
这不会产生与您需要的完全相同的输出,因为您要求进行优化,并且它不涉及多个无用的
echo
语句

另一种方法是使用while循环并检查位位置是否仍然有效。我已经删除了无用的
echo
语句,假设您不需要这些语句,只是想改进代码

bitMask="0x10"
while [ $(bitWiseAnd "31" "$bitMask") -ne 0 ] && ((bitMask))
do
    bitMask=$((bitMask >> 1))
done

只需将硬编码的数字
31
替换为您选择的变量值
$random
bitMask

它不会产生与OP的代码相同的输出,不是吗?请下行投票者解释是什么想法导致您这样做的吗?请注意
如果s
不会永久更改,就在函数的作用域内,它只是一个局部变量。@danday74,您认为这是压缩代码的一个很好的练习吗?如果是这样,你可以接受我的回答。@Inian-谢谢你的相关帖子。我喜欢你的答案。如果你不知道它是如何工作的,那它怎么会是“你的”代码?@Inian啊,是的。这只是OP上一个问题的延续,该问题作为重复问题结束。