12

C プログラミングを始めようとしていますが、~and&演算子のみでビットごとの XOR 関数を書くのに問題があります。例: bitXor(4, 5) = 1. どうすればこれを達成できますか?

これまでのところ、私はこれを持っています:

int bitXor(int x, int y) {

    return z;
}
4

7 に答える 7

39

さて、これについて考えてみましょう。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

これらの 2 つの出力を見ると、非常によく似ています。前の 2 つの出力 (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;
}     
于 2012-09-11T19:54:43.413 に答える
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;
}
于 2012-09-11T18:36:14.090 に答える
8

ことが容易にわかる.

x ^ y = (x | y) & ~(x & y)

|とだけで表現することに&なり~ます。ド・モルガンの法則が教えてくれる

x | y = ~(~x & ~y)
于 2012-09-11T18:36:50.373 に答える
0

~と&だけで書いてほしい

それはNANDゲートに当てはまりますよね?この回路図を調べた後:

int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));

同じことが非ビット単位、つまり論理 1 にも当てはまり!ます~

于 2012-09-11T18:42:39.037 に答える
-3
int xorro(a, b)
{
    if (a == b)
        return 0;
    return 1; 
}
于 2013-10-03T11:54:09.803 に答える