仅来自OR和AND的XOR

时间:2011-01-17 16:08:39

标签: bitwise-operators xor bitwise-and

如果只有AND和OR运算可用,那么如何进行XOR按位运算?

11 个答案:

答案 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内置函数的描述相同的代码或脚本,并使用您自己的返回值或状态值。我们无法告诉您如何在软件社区中进行这种类型的比较。