2

假设a,b,c是三个整数。然后对它们进行异或运算,得到 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 的结果。

4

2 回答 2

1

不,因为对于任何a 和 d,您都可以使等式成立,例如通过设置 b = 0 和 c = a ^ d。

例如,让我们以您的示例为例,其中 d = 2^18^19。您希望 func(12, d) 为“假”,因为 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 有任何不同。

于 2016-12-17T17:48:33.413 回答
0

不,你不能:对于任何一对数字(a 和 d),你总能找到另一个数字(b),它与这对数字中的一个数字相异或得到另一个。

d = a ^ b or a = d ^ b

此外,您正在尝试使用多个 XOR 来做到这一点......

XOR 实际上被用作一种原始的加密方法。您可以尝试猜测,如果您通过 XOR 搜索模式创建了很多数字 d。

于 2016-12-17T17:48:36.897 回答