仅来自OR和AND的XOR

Joh*_*ane 5 xor bitwise-operators bitwise-and

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

Lou*_*nco 11

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的情况下完成

  • 我想我们都知道这些操作对他们的真值表的看法如何.问题是,你可以将前两个结合起来形成第三个,如果是的话,怎么样? (2认同)
  • 如果这是家庭作业,我就开始回答。成为一个方向而不是一个答案。我认为这是不可能的。 (2认同)

Zac*_*aad 11

(a XOR b) = ((a OR b) - (a AND b)),或者换句话说,并集减去交集。

代码示例(在 JavaScript 中):

var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 5

如果除了按位 AND ( ) 和 OR ( ) 之外还有算术运算符,例如 and ,+那么您-可以像这样进行按位 XOR :&|

int bitwise_XOR(int a, int b)
{
    return (a + b) - (a & b) - (a & b);
}
Run Code Online (Sandbox Code Playgroud)

这样做的原因是我们正在进行全加,当任何给定位位置的总和 <= 1 时,这相当于 XOR,然后我们纠正生成进位 (1 + 1) 的情况通过减去2 * (a & b).

请注意,即使中间项溢出,这也有效,假设我们有“正常表现”的整数(2 的补码、溢出的模 2 环绕等)。


MGo*_*ksu 5

“系统 ({T, F}, and) 和 ({T, F}, or) 是幺半群。”

“系统({T,F},xor)是一个阿贝尔群”,与幺半群不同,它具有可逆性。

因此,“与”和“或”无法构造“异或”运算。

资料来源:https ://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra


Chr*_*s J 4

创建我自己的脚本语言 - 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;
}
Run Code Online (Sandbox Code Playgroud)

即使没有 NOT,也可以这样模拟。但这是您在没有某种形式的逆变器的情况下可以获得的最佳解决方案。我很难相信您没有某种形式的可用逆变器——您使用什么脚本环境?

  • 定义“非常有限”——您是否拥有正在使用的实际 JavaScript 引擎(例如 Microsoft JScript)?这是某些专有产品的一部分吗?如果是,是什么产品和版本?如果能够获得尽可能多的有关您的环境的信息,那就太好了。 (2认同)