如何在C中进行逐位XOR

seb*_*ebi 12 c xor bit

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

到目前为止我有这个:

int bitXor(int x, int y) {

    return z;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 35

好吧,让我们考虑一下.XOR做什么?

x   y    XOR
------------
0   0     0
1   0     1
0   1     1
1   1     0
Run Code Online (Sandbox Code Playgroud)

那么我们如何将其变成一个函数呢?让我们考虑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
Run Code Online (Sandbox Code Playgroud)

看看这两个输出,它非常接近,我们所要做的只是NOR两个先前的输出(x和y)(x NOR y),我们有解决方案!

  (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
Run Code Online (Sandbox Code Playgroud)

现在就写出来:

a = ( x & y )
b = ( ~x & ~y )
XOR'd result = (~a & ~b)
Run Code Online (Sandbox Code Playgroud)

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

int bitXor(int x, int y) 
{
    int a = x & y;
    int b = ~x & ~y;
    int z = ~a & ~b;
    return z;
}     
Run Code Online (Sandbox Code Playgroud)


Dav*_*rtz 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)) );
}
Run Code Online (Sandbox Code Playgroud)

要么:

int bitXor(int x, int y)
{
    return ~( (x & y) | (~x & ~y) );
}
Run Code Online (Sandbox Code Playgroud)

要么:

int bitXor(int x, int y)
{
    return (x & ~y) | (~x & y);
}
Run Code Online (Sandbox Code Playgroud)

当然这更容易:

int bitXor(int x, int y)
{
    return x ^ y;
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*her 8

很容易看出来

x ^ y = (x | y) & ~(x & y)
Run Code Online (Sandbox Code Playgroud)

所以它仍然|只有&和表达~.德摩根的法律告诉我们

x | y = ~(~x & ~y)
Run Code Online (Sandbox Code Playgroud)