私はCプログラミングを始めようとしていますが、ビット単位のXOR関数を_~
_および_&
_演算子のみで書くと問題が発生します。例:bitXor(4, 5) = 1
。どうすればこれを達成できますか?
これまでのところ私はこれを持っています:
_int bitXor(int x, int y) {
return z;
}
_
さて、これについて考えてみましょう。 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;
}
[〜#〜] 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;
}
それは簡単に見られます
x ^ y = (x | y) & ~(x & y)
そのため、|
のみ&
および~
。ド・モーガンの法則が教えてくれる
x | y = ~(~x & ~y)
^
演算子を使用して、cでビット単位のXOR操作を実行できます。
int bitXor(int x, int y) {
return ~(~(~x & y) & ~(x & ~y));
}
説明:
x ^ y = (~x & y) | (x & ~y) = ~(~(~x & y) & ~(x & ~y))
最後の手順は De Morganの法則 を利用しています
〜と&のみでそれを書きたい
それはNANDゲートにも当てはまりますか?これを研究した後 回路図:
int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));
同じことは、非ビット単位にも当てはまります。 e。ロジック1も同様に、単に!
の代わりに~
。