Hola a lo mejor no me he sabido explicar bien, cuando usas xor 10 no es necesario poner xor -10 basta con volver a poner xor 10 para hacer efecto.
Revista la documentacion sobre el operador xor
https://es.wikipedia.org/wiki/Disyunci%C3%B3n_exclusiva aplica para cuaquier lenguaje de programacion
Ejemplo
Supongamos que usamos la letra A el equivalente numerico en la tabla ASCII es el 65 cuando usamos el XOR lo que estamos haciendo es es convertir ese 65 a binario el cual seria
01000001
si le aplicamos el XOR 10 lo que estariamos haciendo seria esto
01000001 ===> 65
00001010 ===> 10
------------
01001011 ===> el cual seria el numero 11
ese 11 seria el numero "cifrado" si quisieramos obtener el valor original valdria tomar el equivalente del 11 en binario y volver a aplicar el XOR 10
01001011 ===>11
00001010 ===>10
-------------
01000001 ===== Nos regresa el 65 ===> A
si te fijas nos regreso el valor original
Esto mismo aplicalo a arreglo de bytes o string que al final siguen siendo numeros y tiene un funcionamiento similar
Tablas ASCII
http://www.elcodigoascii.com.ar/Aqui un ejemplo mas detallado sobre los operadores de bit
http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap03-06-Operadores%20para%20digitos%20binarios%20(bits%20-%20digitos%20binarios).php cabe aclarar que esta orientado al lenguaje Object Pascal pero la teoria aplica para cualquier lenguaje.