web-dev-qa-db-ja.com

Cでビット単位のXORにする方法

私はCプログラミングを始めようとしていますが、ビット単位のXOR関数を_~_および_&_演算子のみで書くと問題が発生します。例:bitXor(4, 5) = 1。どうすればこれを達成できますか?

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

_int bitXor(int x, int y) {

    return z;
}
_
12
sebi

さて、これについて考えてみましょう。 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つの出力を見ると、かなり近いので、あとはNOR 2つの前の出力(x AND 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;
}     
35
Mike

[〜#〜] 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;
}
27
David Schwartz

それは簡単に見られます

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

そのため、|のみ&および~。ド・モーガンの法則が教えてくれる

x | y = ~(~x & ~y)
8
Daniel Fischer

^演算子を使用して、cでビット単位のXOR操作を実行できます。

0
MVP
int bitXor(int x, int y) {
  return ~(~(~x & y) & ~(x & ~y));
}

説明:

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

最後の手順は De Morganの法則 を利用しています

0
Aoerz

〜と&のみでそれを書きたい

それはNANDゲートにも当てはまりますか?これを研究した後 回路図:

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

同じことは、非ビット単位にも当てはまります。 e。ロジック1も同様に、単に!の代わりに~

0
user529758