2011-01-17 10 views
2

Wie machen Sie die XOR bitweises Verfahren, wenn Sie nur die Operationen AND und OR haben?XOR von nur OR und AND

+8

Klingt wie eine Hausaufgabe Frage. – Oded

+3

Ich bin mir ziemlich sicher, dass Sie nicht so gut brauchen. – Jens

+0

@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. –

Antwort

1

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?

+0

Eine sehr begrenzte Javascript-Umgebung. –

+0

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. –

+1

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. –

-2

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.

0

ich bin ziemlich sicher, dass die Formel korrekt ist:

a xor b = nicht ((a und b) oder nicht (a + b))

+2

Lesen Sie die Frage noch einmal. NICHT ist nicht verfügbar. – delnan

+0

keine Ahnung dann ... – Noray

7

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

+2

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

+1

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. –

1

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.

2

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.).

1

In C: "Die Systeme ({T, F}, und) und ({T, F}, oder) sind Monoide" x^y = (x & ~y) | (~x & y)

0

(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