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

问题描述 投票:3回答:2

我想添加两个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

bash binary
2个回答
2
投票

让我们定义你的变量(我将使用更短的名字):

$ y=00001010001101110000101001000000
$ t=00000000000000000000000000010000

现在,让我们运行有问题的命令:

$ echo "ibase=2;obase=2;$((y+t))" | bc -l
-1011101110111111111

以上产生了您观察到的错误结果。

要获得正确的结果:

$ echo "ibase=2;obase=2; $y+$t" | bc -l
1010001101110000101001010000

Discussion

命令$((y+t))告诉bash做加法,假设数字是基数为10。 bash添加的结果传递给bc。这不是你想要的:你想要bc做添加。

Using an array

$ y=00001010001101110000101001000000
$ arr=(00000000000000000000000000010000)
$ echo "ibase=2;obase=2; $y+${arr[0]}" | bc -l
1010001101110000101001010000

1
投票

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的启发

© www.soinside.com 2019 - 2024. All rights reserved.