如果只有AND和OR运算可用,那么如何进行XOR按位运算?
答案 0 :(得分:10)
AND
的真值表A B AND T T T T F F F T F F F F
OR的真值表
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就像OR,除非A和B为真,否则它是假的。
所以,(A OR B)AND(NOT(A和B)),即(A OR B)AND(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
不确定是否可以在没有NOT或NAND的情况下完成
答案 1 :(得分:3)
如果除了按位AND(+
)和OR(-
)之外还有&
和|
等算术运算符,那么你可以像这样进行按位异或:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
这个工作的原因是我们正在进行完全加法,当给定位位置的和为< = 1时,它等效于XOR,然后我们正在校正生成进位的情况( 1 + 1)减去2 * (a & b)
。
注意,即使中间项溢出,这也有效,假设我们有“正常表现”的整数(2的补码,模2的溢出回绕等)。
答案 2 :(得分:3)
“系统({T,F},和)和({T,F},或)是幺半群。”
“系统({T,F},xor)是一个阿贝尔群”,与幺半群不同,它具有可逆性。
因此,'和'和'或'无法构造'xor'操作。
来源:https://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra
答案 3 :(得分:2)
Wikipedia's entry on XOR详细介绍了这一点。在提出SO问题之前,可能是一个很好的第一个检查位置。
如果你已经有了一些你不关心掩盖的位,那么在我看来最简单的方法(就编写代码而言)就是使用你的不等操作符。
答案 4 :(得分:1)
创建我自己的脚本语言 - 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,也可以这样模仿。但这是您在没有某种形式的逆变器的情况下获得的最佳解决方案。我发现很难相信你没有某种形式的逆变器可用 - 你在使用什么脚本环境?
答案 5 :(得分:1)
(a XOR b) = ((a OR b) - (a AND b))
,换句话说,联合集减去交集。
代码示例(在javascript中):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
答案 6 :(得分:0)
在C:x ^ y = (x & ~y) | (~x & y)
答案 7 :(得分:0)
在python
...: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
答案 8 :(得分:0)
import numpy as np
from PIL import Image
a = [[(1,1,1,255),(2,2,2,255),(3,3,3,255)],
[(1,1,1,255),(2,2,2,255),(3,3,3,255)],
[(1,1,1,255),(2,2,2,255),(3,3,3,255)]]
x = np.asarray(a, dtype=np.uint8)
Image.fromarray(x)
>>> <PIL.Image.Image image mode=RGBA size=3x3 at 0x7F8C4096E640>
<块引用>
<块引用>
<块引用>
00000110 异或
答案 9 :(得分:-1)
我很确定下面的公式是正确的:
a xor b = not((a和b)或不是(a + b))
答案 10 :(得分:-3)
最好的建议是在网上的参考手册和百科全书网站中查找XOR,然后编写与XOR内置函数的描述相同的代码或脚本,并使用您自己的返回值或状态值。我们无法告诉您如何在软件社区中进行这种类型的比较。