如何在C中进行逐位XOR

时间:2012-09-11 18:33:28

标签: c bit xor

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

到目前为止,我有这个:

int bitXor(int x, int y) {

    return z;
}

7 个答案:

答案 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; 
}