>Это я знаю. Но как совместить функции :-( Ну мог бы и сам! раз знаешь, ну ладно смотри:
0x185A87CEA 110000101101010000111110011101010
0x6B2395E0 1101011001000111001010111100000
------------------------------------------------xor
0x1EE8BE90A 111101110100010111110100100001010
perl 10010100110111000110101000011111 2497473055
здесь все ясно - отбросили старший бит.
javascript 11101110100010111110100100001010 -292820726
perl работает так
bash-3.00$ ./bag_hex_xor32.pl 6537379050 1797494240
first: 6537379050 = 6537379050
second: 1797494240= 1797494240
after $w1 &= 0xfffffffff;
first: 6537379050 = 4294967295 < !!!! перл оставляет максимум от числа, этот максимум потом используется при хор!!!
second: 1797494240= 1797494240
first rez = 2497473055 !!!!!!! rez как раз получается после хор между аргументами
maxnum = 4294967295, halfmax = 2147483647
negative rez = -1797494241
2497473055 = '94DC6A1F'
dec: 8297113866
теперь как сделать:
вот кусок программы(фактически основная часть тестов):
....
my $maxnum = 0xffffffff;
my $maxhalf = $maxnum>>1;
$w1 = normal( $w1);
$w2 = normal( $w2);
print "first: $word1 =\t $w1\n";
print "second: $word2=\t $w2\n";
$rez= $w1^$w2;
#print $w1^$w2;
print "first rez = ".$rez."\n";
print "maxnum = $maxnum, halfmax = $maxhalf\n";
if($rez >= $maxhalf)
{
$rez = -($maxnum-$rez+1);
print "negative rez = $rez\n";
$rez = $maxnum+$rez+1;
}
my $si = sprintf "%08X", $rez;
print "$rez =\t '$si'\n";
exit(0);
sub normal {
my $a = shift;
my $rez;
if($a > $maxnum) {
$rez = $a % $maxnum;
--$rez;
} else {
$rez = $a;
}
return $rez
}
ну и результат:
bash-3.00$ ./bag_hex_xor32.pl 6537379050 1797494240
first: 6537379050 = 6537379050
second: 1797494240= 1797494240
first: 6537379050 = 2242411754
second: 1797494240= 1797494240
first rez = 4002146570
maxnum = 4294967295, halfmax = 2147483647
negative rez = -292820726
4002146570 = 'EE8BE90A'