如何在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; }