C プログラミングを始めようとしていますが、~
and&
演算子のみでビットごとの 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 つの出力を見ると、非常によく似ています。前の 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;
}
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)
~と&だけで書いてほしい
それはNANDゲートに当てはまりますよね?この回路図を調べた後:
int z = ~ ((~(a & ~(a & b)) & (~(b & ~(a & b)));
同じことが非ビット単位、つまり論理 1 にも当てはまり!
ます~
。
int xorro(a, b)
{
if (a == b)
return 0;
return 1;
}