3

2 つの大きなバイナリ値を XOR しようとしています。でも、

echo ${hashArray[1]}
echo ${hashArray[2]}
echo $((${hashArray[1]} ^ ${hashArray[2]}))

与えます:

10100100000111101011100001101110000110000100001000000111001001100010110000010010111101100110111001111100010010000000010101110111

00001110110000010110101101011011100101101000011100011101001101101010000100110001001110101101111100010001111010100011010000000100

4018181242766406943

echo $((${hashArray[1]} ^ ${hashArray[2]}))10 進数を出力するのはなぜですか? 別の大きなバイナリ値であるべきではありませんか?

4

3 に答える 3

5

bash2進数をサポートしていますが、数値が大きすぎるため切り捨てられます。マナが示唆するように実行するか、文字列を分割するか、任意の精度を処理できるライブラリを使用します。たとえば、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;

便宜上、変数に番号を割り当てます。

x=10100100000111101011100001101110000110000100001000000111001001100010110000010010111101100110111001111100010010000000010101110111
y=00001110110000010110101101011011100101101000011100011101001101101010000100110001001110101101111100010001111010100011010000000100

実行:

perl xor.pl $x $y

出力:

0b10101010110111111101001100110101100011101100010100011010000100001000110100100011110011001011000101101101101000100011000101110011
于 2012-09-28T09:15:47.893 に答える
4

そのように「ビットごと」に実行します。

#!/bin/bash

a="101"
b="011"

out=""
for ((i=0; i < ${#a}; i++ )); do
   out=${out}$((${a:$i:1} ^ ${b:$i:1}))
done

echo ${a} ^ ${b} = $out

出力:

101 ^ 011 = 110

編集: 入力は同じ長さである必要があります!

于 2012-09-28T07:36:41.950 に答える
0

bcでビットごとに実行し、最初にファイル logic.bc を取得します。

wget http://phodd.net/gnu-bc/code/logic.bc

xor() をテストする

x=10100100000111101011100001101110000110000100001000000111001001100010110000010010111101100110111001111100010010000000010101110111
y=00001110110000010110101101011011100101101000011100011101001101101010000100110001001110101101111100010001111010100011010000000100

echo "ibase=2;obase=2;xor($x,$y)" | bc -l logic.bc

結果:

10101010110111111101001100110101100011101100010100011010000100001000110100100011110011001011000101101101101000100011000101110011
于 2016-12-20T18:20:28.860 に答える