AND 演算と OR 演算しか利用できない場合、XOR ビット演算はどのように行うのですか?
11 に答える
AND の真理値表
バンド TTT TFF FTF FFF
OR の真理値表
ABまたは TTT TFT FTT FFF
XOR の真理値表
AB XOR TTF TFT FTT FFF
したがって、XOR は OR と同じですが、A と B が true の場合に false になります。
したがって、(A OR B) AND (NOT (A AND B))、つまり (A OR B) AND (A AND B)
AB OR AND NAND [(A OR B) AND (A NAND B)] TTTTFF TFTFT FTTFTT FFFFF
NOTまたはNANDなしで実行できるかどうかわからない
独自のスクリプト言語(ChrisScript)を作成するには、次のようなものが必要です。
#!/bin/chrish
bit XOR (bit A, bit B)
{
bit notA;
bit notB;
IF (A == 0) notA = 1 ELSE notA = 0;
IF (B == 0) notB = 1 ELSE notB = 0;
F = ((A && notB) || (notA && B));
RETURN F;
}
NOTがなくても、このようにエミュレートできます。しかし、これは、何らかの形のインバーターがなくても得られる最善の解決策です。何らかの形のインバーターが利用できないとは信じがたいです。どのスクリプト環境を使用していますか?
「システム ({T, F}, and) および ({T, F}, or) はモノイドです。」
「系 ({T, F}, xor) はアーベル群」であり、モノイドとは異なり可逆性を持つ。
したがって、「and」と「or」は「xor」操作を構成できません。
ソース: https://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra
ビットごとの AND ( ) と OR ( ) に加えて+
andなどの算術演算子がある場合は、次のようにビットごとの XOR を実行できます。-
&
|
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
これが機能する理由は、全加算を行っているためです。これは、特定のビット位置の合計が 1 以下の場合に XOR と同等であり、キャリーが生成された場合 (1 + 1) を修正しています。を差し引いて2 * (a & b)
。
これは、「正常に動作する」整数 (2 の補数、オーバーフローのモジュロ 2 ラップアラウンドなど) があると仮定して、中間項がオーバーフローした場合でも機能することに注意してください。
ウィキペディアの XOR に関するエントリでは、これについて詳しく説明しています。おそらく、SO の質問をする前に最初に確認するのに適した場所です。
気にしないビットが既にマスクされている場合、それを行う最も簡単な方法は (とにかくコードを書く限り)、等しくない演算子を使用することです。
C: x ^ y = (x & ~y) | (~x & y)
以下の式が正しいと確信しています。
a xor b = not((a and b) or not(a+b))
最良のアドバイスは、ネット上のリファレンス マニュアルや百科事典サイトで XOR を検索し、XOR 組み込み関数の説明と同じことを行うコードまたはスクリプトを記述し、独自の戻り値またはステータス値を使用することです。そのようなビットの比較を行う方法を、ソフトウェア コミュニティ内から説明することはできません。