Stai superando i limiti numerici del PHP, quindi usando le normali funzioni otterrai errori di arrotondamento. Il formato floating del PHP (il più preciso) è di 8 bytes, di cui 1 è riservato a esponente e segno: i tuoi valori invece sono da 8 bytes, per cui sbaracchi.
Per risolvere il tuo quesito si può usare la libreria gnu gmp, che esegue operazioni su interi a lunghezza arbitraria:
Codice PHP:
// Questo non funziona: i limiti del PHP vengono superati
$a = 0x9807162534435221;
$b = 0xaaaaaaaaaaaaaaaa;
$c = $a ^ $b;
echo dechex($c) . "\n";
// Questo funziona
$a = gmp_init('9807162534435221', 16);
$b = gmp_init('aaaaaaaaaaaaaaaa', 16);
$c = gmp_xor ($a, $b);
echo gmp_strval($c, 16) . "\n";
Come risultato otterrai:
codice:
32adbc8f9ee9f800
32adbc8f9ee9f88b
e il secondo è il risultato che richiedevi.