如果您只有 AND 和 OR 运算,您将如何进行 XOR 位运算?
11 回答
AND的真值表
AB 和 TTT TFF FTF FFF
OR的真值表
乙或 TTT TFT 光纤到户 FFF
异或的真值表
AB异或 TTF TFT 光纤到户 FFF
所以,XOR 就像 OR 一样,只是如果 A 和 B 为真则为假。
所以,(A OR B) AND (NOT (A AND B)),即 (A OR B) AND (A NAND B)
AB OR AND NAND [(A OR B) AND (A NAND B)] TTTTFF TFTFTT 傅立叶变换 FFFFTF
不确定是否可以在没有 NOT 或 NAND 的情况下完成
创建我自己的脚本语言——ChrisScript——你只需要这样的东西:
#!/bin/chrish
bit XOR (bit A, bit B)
{
bit notA;
bit notB;
IF (A == 0) notA = 1 ELSE notA = 0;
IF (B == 0) notB = 1 ELSE notB = 0;
F = ((A && notB) || (notA && B));
RETURN F;
}
即使没有NOT,也可以这样模拟。但这是您在没有某种形式的逆变器的情况下可以获得的最佳解决方案。我很难相信您没有某种形式的逆变器可用——您使用的是什么脚本环境?
“系统 ({T, F}, and) 和 ({T, F}, or) 是幺半群。”
“系统 ({T, F}, xor) 是一个阿贝尔群”,它具有与幺半群不同的可逆性。
因此,'and' 和 'or' 无法构造 'xor' 运算。
来源:https ://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra
如果除了按位 AND ( )+
和OR ( ) 之外还有算术运算符,那么您可以像这样进行按位 XOR:-
&
|
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
这样做的原因是我们正在进行全加,当 amy 给定位位置的总和 <= 1 时,这相当于 XOR,然后我们正在纠正生成进位 (1 + 1) 的情况通过减去2 * (a & b)
。
请注意,即使中间项溢出,这也有效,假设我们有“正常行为”的整数(2 的补码,溢出的模 2 环绕等)。
(a XOR b) = ((a OR b) - (a AND b))
,或者换句话说,并集减去交集。
代码示例(在 javascript 中):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
Wikipedia 关于 XOR 的条目详细介绍了这一点。在提出 SO 问题之前,可能是一个很好的首先检查的地方。
如果您已经有一些您不关心的位被屏蔽掉,那么在我看来,最简单的方法(就编写代码而言)就是使用您的不相等运算符。
在 C 中: x ^ y = (x & ~y) | (~x & y)
在蟒蛇
...:def xor(a,b):
...: c = (not a) and b
...: d = (not b) and a
...: e = not c
...: f = not d
...: g = e and f
...: h = not g
...: return h
PrintF('%-10s XOR',[inttobinbyte((10 OR 12)-(12 AND 10))])
00000110 异或
我很确定下面的公式是正确的:
a xor b = not((a and b) or not(a+b))
最好的建议是在网络上的参考手册和百科全书站点中查找 XOR,然后编写与 XOR 内置函数的描述相同的代码或脚本,并使用您自己的返回值或状态值。我们无法告诉您如何在软件社区内进行这种类型的位比较。