XOR使用数学运算符

时间:2010-03-05 08:23:22

标签: java c xor

如何使用+, - ,*,/

等基本数学运算符实现XOR

更新:实际上,我需要跟踪具有布尔值的两个矩阵的变化。这可以使用XORing每个值与其他矩阵中的对应值来完成。但是,Lp_Solve库不支持XOR操作。此外,它只接受线性方程。

9 个答案:

答案 0 :(得分:13)

(a - b)²

  

3D plot of (a − b)²

这是因为:

(a − b)² = a * (a − b) + b * (b − a)

由于ℤ2中的乘法是结合(&),而1 - a是否定(!),上述公式相当于a, b ∈ {0, 1}的XOR:

(a & !b) | (b & !a)

请参阅Pascal Cuoq下面的评论,解释为什么这不能是线性等式

答案 1 :(得分:9)

我能提出的最简单的表达方式是:a != b

(之前的最佳努力是(a + b) == 1

答案 2 :(得分:6)

答案 3 :(得分:6)

在Brown,G。和Dell,R。,制定线性和整数线性程序:流氓画廊 可以找到以下XOR的线性规划公式:

Z3 = Z1 XOR Z2

解析为

Z3 <= Z1 + Z2
Z3 >= Z1 - Z2
Z3 >= -Z1 + Z2
Z3 <= 2 - Z1 - Z2

答案 4 :(得分:5)

你能做点什么:

(a + b) % 2

答案 5 :(得分:3)

2因素XOR

虽然(x-y)²是双因素XOR的一个非常紧凑的等式,但这种形式在某些方面具有误导性。

虽然对于1和0的值,这些方程的评估是相同的,但它们在代数上并不相等......

(a − b)²a * (1 − b) + b * (1 − a)

此外,逻辑OR运算符不会在没有约束的情况下作为+进行算术转换。对于两个1的AND条件,这将为您提供值2。如果您首先考虑NOTAND ..

的翻译

NOT = (1-x)

AND = x*y

你真正需要的是这样......

OR = (1-(1-a)(1-b)) = a + b - ab

请注意,OR的特点是纯粹是附加的,因此您加入了两套,但是您不想复制这些集合的任何重叠,因此您减去{{1}通过乘法找到的条件。因此,您的附加项AND减去重叠或a+b条件AND。如果您确定您的集合不会重叠,那么您可以使用

a*b = OR,如果我们知道&{1}}的所有值a + b B'/ P>

同样,我们可以推导出一个XOR方程。使用复合逻辑a*b = 0,你会得到......

(a && !b) || (!a && b) = XOR1 - (1 - a(1-b))(1 - b(1-a))

所以(a-b)²在逻辑和代数的翻译中有些误导。事实证明,这些错误会被二进制输入的约束掩盖,因为条件(a-b)²a(1-b)是互斥的,这放松了处理{b(1-a)运算符的约束。 1}}条件并允许将其建模为OR

吉利德的回答有助于解释为什么AND确实有效。当您展开+ = (x-y)²时,您可以看到它如何满足此基本模型...

(x-y)²

使用这些知识,您可以看到有许多方程式可以工作。例如,满足这些条件的实际最基本的等式是......

x² + y² - 2xy

这与我们为X = A + B - 2*H H <= A H <= B H >= A + B - 1 H >= 0 得出的公式完全相同,但现在我们不仅要删除x + y - 2xy条件(OR)的副本,还要拒绝AND条件全部在一起(-xy)。事实证明,这也是AND ...

的实际代数等价物

-2xy = (a-b)²

a * (1 − b) + b * (1 − a)可用于代替,因为,

a + b - 2ab ≠ (a-b)² = (a-b)²

,值为1和0,

(a-b)² = a² + b² - 2ab (对我来说,这是在代码中使用的最佳模型,原因有两个:1。)它比使用权力2更简单。)它更容易看到它背后的逻辑,因为a被添加到b后跟其重叠的完全否定(x2)a和b)

超越2个因素

当你想要XOR(A,B,C ......)时怎么样?这里的问题是,如果我们试图辨别所有真实条件,就像我们在双因子XOR的复合逻辑中所做的那样,它不能很好地扩展,因为你必须添加每个真理的排列。然而,逻辑就是这样,我们可以通过免费的方式来到XOR ......

a² + b² - 2ab = a + b - 2ab

您可以从中以......的形式为任意数量的因子构建算术XOR。

XOR

有趣的乐趣......想要测试一下吗?这里有一些Excel VBA可以对整个单元格进行异或...

!(A & B & C...) & !(!A & !B & !C...)

模糊

有趣的是停下来思考一下,如果我们使用上面的多因子方程得到一个双因子方程式,我们得到以下结果......

(1 - A*B*C...)(1 - (1-A)(1-B)(1-C)...)

enter image description here

首先要注意的是,这与我们从真实条件中得出的2因子方程相似但不相等......

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 = a + b - ab(1 + a + b - ab)

事实上,区别在于以下术语......

1 - (1 - a(1-b))(1 - b(1-a))a + b - ab(3 - a - b + ab)

那是什么给出的?我认为这是使用赞美的算术神器。如果你注意到,这两个词相互补充,他们会从不同的方向做同样的事情:一个从1上升到2,另一个从3下降到2.两个到达2,但他们的到达方向因为他们接近赞美而有所不同。

要注意的第二点是,两个方程都比1 + a + b - ab3 - a - b + ab等最小方程复杂得多。这是否意味着什么,这种增加的复杂性是否有任何价值?

显然,为此,您必须关注离散点(0,0),(0,1),(1,0)和(1,1)之外的十进制值。 )。这为什么会这么重要?有时您希望放宽离散问题的整数约束。在这种情况下,您必须查看用于将逻辑运算符转换为方程式的前提。

在将布尔逻辑转换为算术时,您的基本构建块是x + y - 2xy(x-y)²运算符,您可以使用它们构建ANDNOT

OR = XOR

OR = (1-(1-a)(1-b)(1-c)...)

因此,如果您正在考虑小数区域,那么值得思考我们如何定义这些运算符以及它们在该区域的行为。

翻译XOR

我们将(1 - a*b*c...)(1 - (1-a)(1-b)(1-c)...)表示为NOT。显然,这个简单的等式适用于0和1的二进制值,但对它来说非常酷的事情是它还为0到1之间的值提供了分数或百分比的补语。这是有用的,因为{ {1}}在布尔逻辑中也称为NOT,当涉及集合时,1-x指的是当前集合之外的所有内容。

翻译NOT

我们将Compliment表示为NOT。再一次,显然它适用于0和1,但是对于0到1之间的值,它的效果更加随意,其中乘法导致部分真值(十进制值)相互减小。可以想象你想要将真相模拟为在这个区域中的平均或累积。例如,如果两个条件假设为半真,那么AND条件只有四分之一真(0.5 * 0.5),或者它是完全正确(0.5 + 0.5 = 1),还是保持半真(({ 0.5 + 0.5)/ 2)?事实证明,对于完全离散且部分真理代表概率的条件,四分之一真理实际上是正确的。例如,你现在和第二次翻转尾巴(二进制条件,50%概率)吗?答案是0.5 * 0.5 = 0.25,或25%为真。积累并不真正有意义,因为它基本上模拟AND条件(记住x*y可以ANDOR条件不建模时现在,所以求和是OR)的特征。如果您正在查看协议和度量,那么平均值是有意义的,但它实际上是+AND混合的建模。例如,要求2个人以1到10的等级说出他们对声明的同意程度&#34;外面是冷的&#34;?如果他们都说5,那么陈述的真相&#34;外面是冷的&#34;是50%。

这里的一点是,如果放宽整数约束,则对小数区域有一些含义。您可能希望这样做以使离散问题更容易/可能解决。您需要考虑价值在这个地区的互动方式以及它们如何被转换回来。

任何一个k

这里有一个最后的消息。如果任意n个输入为真,有时您希望条件为真。这可以被视为放松的OR条件,例如,您愿意接受&amp; b或a&amp; c或b&amp; c。这可以从复合逻辑算术建模...

AND

并应用我们的翻译......

1 - (1-ab)(1-ac)(1-bc)...

这对它有用,但在扩展条款时,这也是一个有趣的模式。有一种变量和指数组合的模式,但这会很长;但是,您可以通过忽略二进制上下文的权限来简化。确切的模式取决于n与k的关系。对于n = k-1,其中k是被测试条件的总数,结果如下:

c1 + c2 + c3 ... ck - n *Π

其中c1到ck都是n变量组合。

例如,如果满足4个条件中的3个就是

abc + abe + ace + bce - 3abce

这具有完美的逻辑意义,因为我们所拥有的是OR条件的加法AND减去重叠的(a && b) || (a && c) || (b && c) ...条件。

如果你开始看n = k-2,k-3等,那么模式会变得更复杂,因为我们有更多的重叠来减去。如果这完全扩展到n = 1的最小值,那么我们只得到一个常规的OR条件。

答案 6 :(得分:0)

异或OR 线性函数,但关于布尔函数的'linear'的definition与多项式函数不同。您必须查看lp_solve库的文档,看看它是否能够处理线性布尔函数。从我所读到的,我不怀疑它可以。

编辑:在进一步研究lp_solve使用的单纯形算法之后,我相当肯定你不能做你想做的事。

答案 7 :(得分:0)

ABS(A + B-1)。如果不做abs,则(A + B-1)*(A + B-1)应该这样做。

答案 8 :(得分:0)

您可以使用此:

Xor(n,x,y)= x + y-Pow(2,n + 1)(floor((x + y)/ Pow(2,n + 1)));

何时

x => Z集合中的正数,x> = 0

y => Z集合中的数字为正,y> = 0

n =>是数据位长度,例如32或64

pow(2,3)=> 2 2 2

楼层(1.6594565)= 1或楼层(4562.21)= 4562

相关问题