我正在尝试进行 C 编程,但在编写仅使用~
和&
运算符的按位 XOR 函数时遇到了麻烦。示例:bitXor(4, 5) = 1
。我怎样才能做到这一点?
到目前为止,我有这个:
int bitXor(int x, int y) {
return z;
}
好吧,让我们考虑一下。异或是做什么的?
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;
}
使用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)
所以它仍然|
只用&
and来表示~
。德摩根定律告诉我们
x | y = ~(~x & ~y)
我希望它只用 ~ 和 &
这对 NAND 门很重要,对吧?研究了这个电路图后:
int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));
这同样适用于非按位,即逻辑一,只是替换!
而不是~
.
您可以使用运算符在 c 中执行按位异或^
运算。
int bitXor(int x, int y) {
return ~(~(~x & y) & ~(x & ~y));
}
解释:
x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))
最后一个程序是利用德摩根定律
int xorro(a, b)
{
if (a == b)
return 0;
return 1;
}