我正在尝试添加两个32位二进制数。其中一个是常量(address_range_in_binary
),另一个是数组的元素(IPinEachSubnet[$val]
我试图按照这里的说明进行操作,但我不知道如何使用变量来完成。我一直在尝试使用下面的不同组合,但它们似乎都不起作用。这可能是一个简单的语法问题。如有任何帮助,将不胜感激。以下是打印一些负随机值。
例如,如果值如下:
$address_range_in_binary=00001010001101110000101001000000
$IPinEachSubnet[$val]=00000000000000000000000000010000
echo "ibase=2;obase=2;$((address_range_in_binary+IPinEachSubnet[$val]))" | bc -l
其输出是< code >-1011101110111111110
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 十进制到二进制转换
让我们定义你的变量(我将使用更短的名称):
$ 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