我想添加两个32位二进制数。其中一个是常数(address_range_in_binary
),另一个是数组的元素(IPinEachSubnet[$val]
)
我试图按照here的说明,但我无法弄清楚如何使用变量完成它。我一直在尝试使用下面的不同组合,但它们似乎都没有用。这可能是一个简单的语法问题。任何帮助,将不胜感激。以下是打印一些负的随机值。
例如,如果值如下:
$address_range_in_binary=00001010001101110000101001000000
$IPinEachSubnet[$val]=00000000000000000000000000010000
echo "ibase=2;obase=2;$((address_range_in_binary+IPinEachSubnet[$val]))" | bc -l
这个的输出是-1011101110111111110
让我们定义你的变量(我将使用更短的名字):
$ y=00001010001101110000101001000000
$ t=00000000000000000000000000010000
现在,让我们运行有问题的命令:
$ echo "ibase=2;obase=2;$((y+t))" | bc -l
-1011101110111111111
以上产生了您观察到的错误结果。
要获得正确的结果:
$ echo "ibase=2;obase=2; $y+$t" | bc -l
1010001101110000101001010000
命令$((y+t))
告诉bash做加法,假设数字是基数为10。 bash添加的结果传递给bc
。这不是你想要的:你想要bc
做添加。
$ y=00001010001101110000101001000000
$ arr=(00000000000000000000000000010000)
$ echo "ibase=2;obase=2; $y+${arr[0]}" | bc -l
1010001101110000101001010000
bash
唯一的解决方案
y=2#00001010001101110000101001000000
t=2#00000000000000000000000000010000
oct=$(printf '%o' $(( y + t ))) # no bin format in printf
o2b=({0..1}{0..1}{0..1})
r=''
for (( i=0; i<${#oct}; i++ ))
do
r+=${o2b[${oct:$i:1}]}
done
echo $r
从oct到bin的转换受到Bash shell Decimal to Binary conversion的启发