Dado el entero A y B, encuentre el entero X para que:
- A, B <2 * 1e18
- A xor X = B + X
Dudo mucho que sea posible resolver esta ecuación usando las matemáticas. Este es un problema de codificación que encontré hace 3 años e incluso ahora no puedo resolverlo por mí mismo.
Mi código hasta ahora: (esta es la solución de fuerza bruta)
#include <iostream>
using namespace std;
int main()
{
unsigned long long a, b;
cin >> a >> b;
for (unsigned long long x = 1; x < max(a, b); x++) {
unsigned long long c = a ^ x;
unsigned long long d = b + x;
if (c == d) {
cout << x << endl;
break;
return 0;
}
}
cout << -1; //if no such integer exists
return 0;
}
a xor b = a + b mod 2
. Intenta pensar en esa equivalencia por un tiempo.mod 2
a la matemática (mod 2), es decir, 3 === 7 (mod 2). El punto es que puedes descubrir una ecuación para el primer bit de X, luego pasar al siguiente bit donde (respetando el carry) obtienes una ecuación para el segundo bit, etc., como la respuesta de Daniel.Respuestas:
Tenga en cuenta que
A + X == (A xor X) + ((A and X)<<1)
. Entonces:Y tenemos:
Si se cumple la condición, para cualquier número entero Y que no tenga bits establecidos en A, (((A - B) >> 1) o Y) es una solución. Si solo desea una solución, puede usar ((A - B) >> 1), donde Y = 0. De lo contrario, no hay solución.
fuente
A xor X
es "suma sin llevar", y((A and X)<<1)
es "llevar en la adición". ComoA + X
es "suma con carry", la primera ecuación tiene sentido.(A and X)<<1
es básicamente2*(A and X)
y porque esto es igual aA-B
esto dice que el problema puede tener una solución solo si A y B son ambos eventos impares o ambos.No es muy difícil, solo necesita pensar en pequeño: supongamos que estamos escribiendo
A
,B
yX
en binario, yAᵢ
es el valor correspondiente al bit más a la derecha de 2 ⁱ .Sabemos que:
Aₒ ⊕ Xₒ = Bₒ + Xₒ
.Usemos un ejemplo para descubrir cómo evaluar eso: A = 15 y B = 6. Convertir a binario:
Ahora tenemos algunas posibilidades. Analicemos los bits más a la derecha de A y B:
Sabemos que
d
solo puede ser 0 o 1, así que:Es notable que XOR se comporta como una suma binaria (con la diferencia de que XOR no crea un arrastre para la siguiente suma de bits):
por lo que no siempre será posible encontrar una X que satisfaga
A ⊕ X = B + X
, porque no hay un valord
que satisfaga1 + d = 0 + d
.De todos modos, si existe X, puede encontrarlo de esta manera, de derecha a izquierda, encontrando poco a poco.
EJEMPLO DE TRABAJO COMPLETO
A = 15, B = 7:
Aquí, se aplican tanto d = 0 como d = 1, ¿entonces qué? Necesitamos verificar el siguiente bit. Supongamos que d = 1:
entonces en este caso, d debe ser 0.
pero que hay de b? necesitamos verificar el siguiente bit, como siempre:
y ahora, por
a
:aquí
a
puede ser 0 y 1, pero debe ser 0, para evitar un arrastre en la sumaB + X
.Entonces,
X = 0 1 0 0
entonces X = 4.CÓDIGO
Puedes probarlo aquí .
fuente