如何使这个按位代码更简洁?

时间:2017-01-24 06:30:45

标签: 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 ${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

我不知道这段代码是如何工作的。这段代码可以更简洁吗?

2 个答案:

答案 0 :(得分:3)

您可以使用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))
}

答案 1 :(得分:1)

不会根据需要生成完全相同的输出,因为您要求进行优化,并且不涉及多个无用的echo语句。

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

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

只需将硬编码的号码31替换为您选择的变量值$randombitMask