XOR OR AND ANDから
-
12-10-2019 - |
質問
and and operationsのみを利用できる場合、xorビットワイズ操作はどのように行いますか?
解決
私自身のスクリプト言語を作成する-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;
}
そうでなくても、このようにエミュレートできます。しかし、これは何らかの形のインバーターを持たずに得る最良の解決策です。何らかの形のインバーターが利用できないと信じるのは難しいと思います - どのスクリプト環境を使用していますか?
他のヒント
真実のテーブルと
A B AND T T T T F F F T F F F F
またはの真理テーブルまたは
A B OR T T T T F T F T T F F F
Xorの真実のテーブル
A B XOR T T F T F T F T T F F F
したがって、xorはまったく同じか、aとbが真である場合にfalseであることを除いて。
したがって、(aまたはb)および((aおよびb)ではない)、(aまたはb)と(a nand b)
A B OR AND NAND [(A OR B) AND (A NAND B)] T T T T F F T F T F T T F T T F T T F F F F T F
notまたはnandなしでそれができるかどうかはわかりません
「システム({t、f}、および)および({t、f}、または)はモノイドです。」
「システム({t、f}、xor)は、モノイドとは異なり、可逆性の特性を持つアベルのグループです」。
したがって、 'and' and 'または'または 'xor操作の構築に失敗します。
ソース: https://en.wikipedia.org/wiki/exclusive_or#relation_to_modern_algebra
次のような算術演算子がある場合 +
と -
ビットワイズに加えて(&
)および(または()|
)その後、このようにビットワイズ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に関するウィキペディアのエントリ これを詳細に説明します。おそらく、そう質問をする前にチェックするのに良い最初の場所でしょう。
既にマスクされたものを気にしていない場合、それは私にはそれを行う最も簡単な方法は(とにかくコードを書く限り)、あなたの平等ではないオペレーターを使用することです。
(a XOR b) = ((a OR b) - (a AND b))
, 、または言い換えれば、組合は交差点セットを差し引いたものです。
コード例(JavaScriptで):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
Cで: x ^ y = (x & ~y) | (~x & y)
以下の式が正しいと確信しています:
A xor b = not((a and b)かどうか(a+b))
最善のアドバイスは、参照マニュアルとネット上の百科事典サイトでXORを調べてから、XORビルトイン関数が何をしているかを説明し、独自のリターンまたはステータス値を使用するコードまたはスクリプトを作成することです。ソフトウェアコミュニティ内からそのタイプのビットの比較を行う方法を説明することはできません。