Как XOR числа вместе, а затем извлечь номер
Допустим, a, b, c - три целых числа. Затем сделайте XOR их вместе и получите d = a ^ b ^ c.
Если я знаю только "a" и "d", и нет никакой связи между a, b, c. Есть ли способ проверить, использовался ли "a" для получения "d"?
Например:
d = a ^ b ^ c;
func(a, d); //returns true
func(b, d); //returns true
func(f, d); //returns false, for f!=a, f!=b, f!=c
Я имею в виду, что "d" является результатом "a ^ b ^ c", и мы не знаем этого заранее. Теперь, учитывая "d" и число "x", могу ли я проверить, является ли x одним из a или b или c?
Извините, я забыл упомянуть, что a, b, c, d не являются логической переменной здесь. Я использую их для обозначения целых чисел в любом языке программирования. Таким образом, d = a ^ b ^ c является побитовой операцией. Например, d равно результату 2^18^19.
2 ответа
Нет, потому что для любых a и d вы можете сделать уравнение истинным, например, установив b = 0 и c = a ^ d.
Например, давайте возьмем ваш пример, где d = 2 ^ 18 ^ 19. Вы хотите, чтобы func(12, d) было равно false, потому что 12 не равно 2, 18 или 19. Проблема в том, что d равно 3; он не "помнит", что он был сделан из 2, 8 и 19 вообще. Таким образом, d = 2^18^19 = 3 = 12^0^15 = 7^12^8 = 4^11^12 =... и нет причин, учитывая только d = 3, просматривать 12 или 0 или 15 или 7 или 8 или 4 или 11 как отличающиеся от 2 или 18 или 19.
Нет, вы не можете: для любой пары чисел (a и d) вы всегда можете найти другое число (b), которое XORed с одним из чисел в паре дает другое.
d = a ^ b or a = d ^ b
Более того, вы пытаетесь сделать это с несколькими XOR...
XOR фактически используется в качестве примитивного метода шифрования. Вы можете попытаться догадаться, что если бы у вас было много чисел, созданных с помощью XOR, для поиска шаблона.