我的按位代码有效:
#!/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
我不知道这段代码是如何工作的。这段代码可以更简洁吗?
答案 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
替换为您选择的变量值$random
和bitMask
。