我花了最近5个小时寻找答案。即使我找到了许多答案,但他们也没有任何帮助。
我基本上寻找的是任何32位无符号整数的按位XOR运算符的数学,算术表示。
即使这听起来很简单,但没有人(至少看起来如此)设法找到这个问题的答案。
我希望我们能集思广益,共同寻找解决方案。
感谢。
答案 0 :(得分:8)
这是similar longer answer I gave ...
的摘要基本逻辑运算符
NOT
= (1-x)
AND
= x*y
从那些操作员我们可以得到......
OR
= (1-(1-a)(1-b))
= a + b - ab
OR
= a + b
,如果我们知道&{1}}的所有值a*b = 0
B'/ P>
2-Factor XOR
从所有真实条件的集合中得出......
XOR
= 1 - (1 - a(1-b))(1 - b(1-a))
= a + b - ab(3 - a - b + ab)
从赞美真实条件中得出......
XOR
= (1 - abc)(1 - (1-a)(1-b)(1-c))
= a + b - ab(1 + a + b - ab)
因为我们可以使用互斥条款编写(a & !b) || (!a & b)
,所以我们可以将OR
翻译简化为+
并获得...
XOR
= a + b - 2ab
对于二进制值,我们可以将此表达式压缩为
XOR
= (a-b)²
多因素XOR
XOR
= (1 - A*B*C...)(1 - (1-A)(1-B)(1-C)...)
Excel VBA示例...
Function ArithmeticXOR(R As Range, Optional EvaluateEquation = True)
Dim AndOfNots As String
Dim AndGate As String
For Each c In R
AndOfNots = AndOfNots & "*(1-" & c.Address & ")"
AndGate = AndGate & "*" & c.Address
Next
AndOfNots = Mid(AndOfNots, 2)
AndGate = Mid(AndGate, 2)
'Now all we want is (Not(AndGate) AND Not(AndOfNots))
ArithmeticXOR = "(1 - " & AndOfNots & ")*(1 - " & AndGate & ")"
If EvaluateEquation Then
ArithmeticXOR = Application.Evaluate(xor2)
End If
End Function
任何一个k
可以扩展这些相同的方法,以允许k个条件中的任何n个数字合格为真。
例如,在三个变量a,b和c中,如果您愿意接受任何两个条件,那么您需要& b或a& c或b& c。这可以从复合逻辑算术建模...
(a && b) || (a && c) || (b && c) ...
并应用我们的翻译......
1 - (1-ab)(1-ac)(1-bc)...
这可以扩展到k个条件中的任何n个数。有一种变量和指数组合的模式,但这会很长;但是,您可以通过忽略二进制上下文的权限来简化。确切的模式取决于n与k的关系。对于n = k-1,其中k是被测试条件的总数,结果如下:
c1 + c2 + c3 ... ck - n *Π
其中c1到ck都是n变量组合。
例如,如果满足4个条件中的3个就是
abc + abe + ace + bce - 3abce
这具有完美的逻辑意义,因为我们所拥有的是OR
条件的加法AND
减去重叠的AND
条件。
如果你开始看n = k-2,k-3等,那么模式会变得更复杂,因为我们有更多的重叠来减去。如果这完全扩展到n = 1的最小值,那么我们只得到一个常规的OR
条件。
答案 1 :(得分:1)
“数学,算术表示”无论如何都不是正确的术语。您正在寻找的是从IxI到I(整数域)的函数 您希望对此功能有哪些限制?只有线性代数? (+, - ,*,/)那么模拟XOR运算符是不可能的 如果您接受一些非线性运算符,如Max()Sgn()等,您可以使用一些“更简单”的运算符来模拟XOR运算符。
答案 2 :(得分:0)
鉴于(ab)(ab)非常明显地为单个位计算xor,你可以构造一个带有floor或mod算术运算符的函数来将这些位分开,然后xor,然后总和重组。 (ab)(ab)= a 2 -2·a·b + b 2 因此xor的一位给出一个带有3个项的多项式
如果没有地板或mod,不同的位会相互干扰,所以你一直看着一个polynomial interpolation的解决方案,它将输入a,b视为单个值: a xor b = g(a·2 32 + b)
多项式有2个 64 -1项,但在a和b中是对称的,因为xor是可交换的,所以你只需要计算一半的系数。我没有空间为你写出来。
答案 3 :(得分:0)
(a-b)*(a-b)是正确答案。唯一的?我想是的!
答案 4 :(得分:0)
我无法找到32位无符号整数的任何解决方案,但我找到了一些 2位整数的解决方案,我试图在我的Prolog中使用程序。
我的解决方案之一(使用取幂和模数)在this StackOverflow question中描述,而其他解决方案(一些没有取幂,纯代数)可以在this code repository on Github中找到:看到不同的xor0
和{{ 1}}实现。
对于2位uint,最好的xor表示似乎是:o_xor0
。
使用+, - ,*,/表示为Excel公式(其中A2到A5的单元格,B1到E1的单元格包含数字0-4)的解决方案将插入到A2到E5的单元格中:
xor(A,B) = (A + B*((-1)^A)) mod 4
答案 5 :(得分:0)
对于32位无符号整数,可以调整和优化this solution。它很复杂,它使用对数但似乎是最通用的,因为它可以用于任何整数。另外,你必须检查它是否真的适用于所有数字组合。
答案 6 :(得分:0)
我确实认识到这是一个古老的主题,但问题 是 值得回答,是的,这可以使用算法。而不是详细介绍它是如何工作的,我只是用一个简单的例子(用 C 编写)演示:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
typedef unsigned long
number;
number XOR(number a, number b)
{
number
result = 0,
/*
The following calculation just gives us the highest power of
two (and thus the most significant bit) for this data type.
*/
power = pow(2, (sizeof(number) * 8) - 1);
/*
Loop until no more bits are left to test...
*/
while(power != 0)
{
result *= 2;
/*
The != comparison works just like the XOR operation.
*/
if((power > a) != (power > b))
result += 1;
a %= power;
b %= power;
power /= 2;
}
return result;
}
int main()
{
srand(time(0));
for(;;)
{
number
a = rand(),
b = rand();
printf("a = %lu\n", a);
printf("b = %lu\n", b);
printf("a ^ b = %lu\n", a ^ b);
printf("XOR(a, b) = %lu\n", XOR(a, b));
getchar();
}
}
答案 7 :(得分:0)
我认为这种关系可能有助于回答您的问题
A + B = (A XOR B ) + 2*(A.B)