题
如果您只有可用的和或操作,则如何进行XOR位操作?
解决方案
创建我自己的脚本语言 - 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;
}
即使没有,也可以像这样模拟。但这是如果没有某种形式的逆变器,您将获得最好的解决方案。我发现很难相信您没有某种形式的逆变器 - 您正在使用什么脚本环境?
其他提示
真相表
A B AND T T T T F F F T F F F F
真相表
A B OR T T T T F T F T T F F F
XOR真相表
A B XOR T T F T F T F T T F F F
因此,XOR就像或者,如果A和B为真,则是错误的。
因此,(a或b)和(不是(a和b)),是(a或b)和(a nand b)
A B OR AND NAND [(A OR B) AND (A NAND B)] T T T T F F T F T F T T F T T F T T F F F F T F
不确定是否可以不用或没有
“系统({t,f},和)和({t,f},或)是单体。”
“系统({t,f},XOR)是一个阿贝尔群体”,具有与单体不同的可逆性属性。
因此,'和'和'或'或“无法构建XOR”操作。
资源: https://en.wikipedia.org/wiki/exclusive_or#relation_to_modern_algebra
如果您有算术操作员,例如 +
和 -
除了位和(&
)和或(|
)然后,您可以这样做XOR:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
这项工作的原因是我们正在完成一个完整的添加,当Amy给定位置的总和为<= 1时,这等效于XOR,然后我们要纠正生成携带的情况(1 + 1)通过减去 2 * (a & b)
.
请注意,即使在中间术语溢出的情况下,这也有效,假设我们已经“正常表现”整数(2的补充,Modulo 2环绕以溢出等)。
Wikipedia在XOR上的条目 详细介绍一下。可能是一个很好的第一个检查,然后再解决一个问题。
如果您已经有一个位,您不在乎蒙面,在我看来,最简单的方法(就编写代码而言,无论如何都可以使用)就是使用您的非平等操作员。
(a XOR b) = ((a OR b) - (a AND b))
, ,或换句话说,联盟设置减去交点集。
代码示例(在JavaScript中):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
在C中: x ^ y = (x & ~y) | (~x & y)
我很确定以下公式是正确的:
a xor b =不((a和b)或不(a+b))
最佳建议是在网络上查找参考手册和百科全网站中的XOR,然后编写与XOR内置函数的描述相同的代码或脚本,并使用您自己的返回或状态值。我们无法告诉您如何从软件社区内部进行这种类型的比较。