如何在C中进行逐位XOR

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

到目前为止我有这个:

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

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

 xy XOR ------------ 0 0 0 1 0 1 0 1 1 1 1 0 

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

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

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

  (a) (b) ( a NOR b ) x AND yx 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; } 

使用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; } 

很容易看出来

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

所以仍然要表达 只有&~ 。 德摩根的法律告诉我们

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

我希望它只用〜和&写它

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

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

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

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

 int xorro(a, b) { if (a == b) return 0; return 1; }