提问者:小点点

如何在bash中进行二进制加法


我正在尝试添加两个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


共2个答案

匿名用户

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