我正在尝试进入C编程,而我在编写仅使用~
和&
运算符的按位XOR函数时遇到问题。示例:bitXor(4, 5) = 1
。我怎样才能做到这一点?
到目前为止,我有这个:
int bitXor(int x, int y) {
return z;
}
答案 0 :(得分:35)
好吧,让我们考虑一下。 XOR做什么?
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
看看这两个输出,它非常接近,我们所要做的只是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
现在就写出来:
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;
}
答案 1 :(得分: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)) );
}
或者:
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;
}
答案 2 :(得分:8)
很容易看出
x ^ y = (x | y) & ~(x & y)
所以仅用|
和&
来表达~
。德摩根的法律告诉我们
x | y = ~(~x & ~y)
答案 3 :(得分:0)
我希望它只能用〜和&
来编写
这与NAND门有关,对吗?在研究了这个circuit diagram:
之后int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));
同样适用于非按位,i。即逻辑1,只需替换!
而不是~
。
答案 4 :(得分:0)
您可以使用^
运算符在c中执行按位XOR运算。
答案 5 :(得分:0)
int bitXor(int x, int y) {
return ~(~(~x & y) & ~(x & ~y));
}
说明:
x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))
最后一个过程是使用De Morgan's laws
答案 6 :(得分:-3)
int xorro(a, b)
{
if (a == b)
return 0;
return 1;
}