Wie machen Sie die XOR bitweises Verfahren, wenn Sie nur die Operationen AND und OR haben?XOR von nur OR und AND
Antwort
Sprache meine eigene Skript erstellen - ChrisScript - Sie brauchen etwas wie:
#!/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;
}
Auch ohne nicht, kann es so emuliert werden. Aber das ist die beste Lösung, die Sie erhalten, ohne irgendeine Form von Wechselrichter zu haben. Ich finde es schwer zu glauben, dass Sie keine Form von Inverter zur Verfügung haben - welche Scripting-Umgebung benutzen Sie?
Eine sehr begrenzte Javascript-Umgebung. –
Auch muss ich es Int durch int tun, nicht nach und nach, da ich nicht einzelne Bits erhalten kann, aus Mangel an Bit-Shifting-Operatoren. –
Definieren Sie "sehr begrenzt" - haben Sie die tatsächliche Javascript-Engine, die Sie verwenden (z. B. Microsoft JScript)? Ist das ein Teil einer proprietären Sache, wenn ja, welches Produkt und welche Version? Es wäre schön, so viele Informationen über Ihre Umgebung wie möglich zu haben. –
Der beste Rat ist, XOR in Referenzhandbüchern und Enzyklopädienseiten im Netz nachzuschlagen und dann einen Code oder ein Skript zu schreiben, das dasselbe tut wie die Beschreibung einer eingebauten XOR-Funktion und eigene Rückgabe- oder Statuswerte verwendet . Wir können Ihnen nicht sagen, wie Sie diese Art von Bit-Vergleichen innerhalb der Software-Community durchführen können.
Wahrheitstabelle für AND
A B AND T T T T F F F T F F F F
Wahrheitstabelle für OR
A B OR T T T T F T F T T F F F
Wahrheitstabelle für XOR
A B XOR T T F T F T F T T F F F
Also XOR ist wie OR, außer es ist falsch, wenn A und B wahr sind.
Also, (A oder B) und (NOT (A und B)), die (A oder B) und (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
Nicht sicher, ob es ohne nicht getan werden kann oder NAND
Ich denke, wir alle wissen, was diese Operationen tun, wie ihre Wahrheit Tabellen aussehen. Die Frage ist, können Sie die ersten beiden kombinieren, um die dritte zu bilden, und wenn ja, wie? – delnan
Ich begann meine Antwort für den Fall, dass es Hausaufgaben war. Eine Richtung sein und keine Antwort. Ich denke nicht, dass es gemacht werden kann. –
Wikipedia's entry on XOR geht dies im Detail. Wahrscheinlich eine gute erste Anlaufstelle, bevor Sie eine SO-Frage stellen.
Wenn Sie bereits Bits haben, die Sie nicht maskiert interessieren, scheint es mir der einfachste Weg, es zu tun (soweit das Schreiben des Codes sowieso geht), ist nur Ihre nicht gleich Operator zu verwenden.
Wenn Sie arithemtic Operatoren wie +
und -
zusätzlich müssen bitweise AND (&
) und OR (|
), dann können Sie bitweise XOR wie folgt tun:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
Der Grund dies funktioniert, ist, dass wir machen eine vollständige add, die XOR entspricht, wenn die Summe für amy gegebenen Bitposition < = 1 ist, und dann korrigieren wir für den Fall, wo ein Übertrag generiert wird (1 + 1) durch Subtraktion 2 * (a & b)
.
Beachten Sie, dass dies funktioniert, selbst wenn die Zwischenbedingungen überlaufen, vorausgesetzt, wir haben "normal benommen" Ganzzahlen (Zweierkomplement, Modulo 2 Wraparound für Überlauf, usw.).
In C: "Die Systeme ({T, F}, und) und ({T, F}, oder) sind Monoide" x^y = (x & ~y) | (~x & y)
"Das System ({T, F}, xor) ist eine abelsche Gruppe", die die Eigenschaft der Invertierbarkeit von Monoiden unterscheidet.
Daher 'und' und 'oder' nicht 'xor' Operation zu konstruieren.
Quelle: https://en.wikipedia.org/wiki/Exclusive_or#Relation_to_modern_algebra
(a XOR b) = ((a OR b) - (a AND b))
, oder in anderen Worten, die Vereinigungsmenge minus der Schnittmenge.
Code-Beispiel (in JavaScript):
var a = 5;
var b = 12;
var xor = (a | b) - (a & b); // result: 9
Klingt wie eine Hausaufgabe Frage. – Oded
Ich bin mir ziemlich sicher, dass Sie nicht so gut brauchen. – Jens
@Oded Nein, ich möchte nur wissen. Ich programmiere in einer Scripting-Umgebung, die nur AND und OR hat, aber weder NOT noch XOR, und ich brauche XOR. Ihr Jungs von StackOverflow ist sicher schnell etwas als Hausaufgabe zu beurteilen. Auch ich verstehe diesen Link nicht, ich habe ihn mir schon angesehen bevor ich die Frage gestellt habe. –