12

我正在尝试进行 C 编程,但在编写仅使用~&运算符的按位 XOR 函数时遇到了麻烦。示例:bitXor(4, 5) = 1。我怎样才能做到这一点?

到目前为止,我有这个:

int bitXor(int x, int y) {

    return z;
}
4

7 回答 7

39

好吧,让我们考虑一下。异或是做什么的?

x   y    XOR
------------
0   0     0
1   0     1
0   1     1
1   1     0

那么我们如何把它变成一个函数呢?让我们考虑一下 AND,以及 AND (~x&~y) 的逆序(这恰好是 NOR):

              (~x&~y)
 x   y   AND    NOR   
 ---------------------
 0 & 0  = 0      1    
 1 & 0  = 0      0 
 0 & 1  = 0      0
 1 & 1  = 1      0

看看这两个输出,它非常接近,我们所要做的就是对之前的两个输出 (x AND y) (x NOR y) 进行 NOR 处理,我们就有了解决方案!

  (a)       (b)    ( a NOR b )
x AND y   x NOR y    ~a & ~b
-------------------------------
   0         1          0
   0         0          1
   0         0          1
   1         0          0

现在把它写出来:

a = ( x & y )
b = ( ~x & ~y )
XOR'd result = (~a & ~b)

答对了!现在只需将其写入函数

int bitXor(int x, int y) 
{
    int a = x & y;
    int b = ~x & ~y;
    int z = ~a & ~b;
    return z;
}     
于 2012-09-11T19:54:43.413 回答
27

使用NAND逻辑:

int bitNand(int x, int y)
{
    return ~ (x & y);
}

int bitXor(int x, int y)
{
    return bitNand( bitNand(x, bitNand(x, y)),
                    bitNand(y, bitNand(x, y)) );
}

或者:

int bitXor(int x, int y)
{
    return ~( (x & y) | (~x & ~y) );
}

或者:

int bitXor(int x, int y)
{
    return (x & ~y) | (~x & y);
}

当然这更容易:

int bitXor(int x, int y)
{
    return x ^ y;
}
于 2012-09-11T18:36:14.090 回答
8

很容易看出

x ^ y = (x | y) & ~(x & y)

所以它仍然|只用&and来表示~。德摩根定律告诉我们

x | y = ~(~x & ~y)
于 2012-09-11T18:36:50.373 回答
0

我希望它只用 ~ 和 &

这对 NAND 门很重要,对吧?研究了这个电路图后:

int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));

这同样适用于非按位,即逻辑一,只是替换!而不是~.

于 2012-09-11T18:42:39.037 回答
0

您可以使用运算符在 c 中执行按位异或^运算。

于 2017-01-21T09:28:30.180 回答
0
int bitXor(int x, int y) {
  return ~(~(~x & y) & ~(x & ~y));
}

解释:

x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))

最后一个程序是利用德摩根定律

于 2019-09-10T14:41:51.913 回答
-3
int xorro(a, b)
{
    if (a == b)
        return 0;
    return 1; 
}
于 2013-10-03T11:54:09.803 回答