我正在尝试进入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)
很容易看出来
x ^ y = (x | y) & ~(x & y)
Run Code Online (Sandbox Code Playgroud)
所以它仍然|只有&和表达~.德摩根的法律告诉我们
x | y = ~(~x & ~y)
Run Code Online (Sandbox Code Playgroud)