为什么XORing两个大二进制数给出十进制输出?

gp_*_*xps 3 bash

我试图XOR两个大的二进制值.然而,

echo ${hashArray[1]}
echo ${hashArray[2]}
echo $((${hashArray[1]} ^ ${hashArray[2]}))
Run Code Online (Sandbox Code Playgroud)

得到:

10100100000111101011100001101110000110000100001000000111001001100010110000010010111101100110111001111100010010000000010101110111

00001110110000010110101101011011100101101000011100011101001101101010000100110001001110101101111100010001111010100011010000000100

4018181242766406943
Run Code Online (Sandbox Code Playgroud)

为什么echo $((${hashArray[1]} ^ ${hashArray[2]}))输出十进制数?它不应该是另一个大的二进制值吗?

Tho*_*hor 5

bash确实支持二进制数,但是你的数字太大而且会被截断.无论是作为法术力建议还是拆分字符串或使用可以处理任意精度的库,例如perl的Math :: BigInt浮现在脑海中:

xor.pl

use Math::BigInt;

$x = Math::BigInt->new("0b" . $ARGV[0]); 
$y = Math::BigInt->new("0b" . $ARGV[1]);

print $x->bxor($y)->as_bin;
Run Code Online (Sandbox Code Playgroud)

为方便起见,将数字分配给变量:

x=10100100000111101011100001101110000110000100001000000111001001100010110000010010111101100110111001111100010010000000010101110111
y=00001110110000010110101101011011100101101000011100011101001101101010000100110001001110101101111100010001111010100011010000000100
Run Code Online (Sandbox Code Playgroud)

运行:

perl xor.pl $x $y
Run Code Online (Sandbox Code Playgroud)

输出:

0b10101010110111111101001100110101100011101100010100011010000100001000110100100011110011001011000101101101101000100011000101110011
Run Code Online (Sandbox Code Playgroud)