XOR
XOR | |
Syntax: | XOR(<Zahl1>,<Zahl2>) |
Parameter | |
<Zahl1>,<Zahl2>: numerische Ausdrücke im Wertebereich von 0 bis 65535 | |
Einordnung | |
Typ: | numerische Funktion |
Kontext: | Arithmetik |
Aufgabe: | Binäre Exklusiv-Oder-Verknüpfung zweier Zahlen |
Abkürzung: | xO |
Token: | $ce $08 (206 8) |
Verwandte Befehle | |
AND, OR, NOT |
Anmerkung: Dieser Artikel beschreibt die BASIC-Funktion XOR ab Commodore BASIC V7.0 oder höher.
Die BASIC-Funktion XOR verknüpft zwei Zahlen im Bereich von 0 bis 65535 (vorzeichenlose 16-Bit Ganzzahlen) bitweise gemäß boolscher Exklusiv-Oder-Funktion (vergleichbar mit dem Assembler-Befehl EOR bzw. ähnlich Simons' Basic EXOR-Funktion). Dabei ist das Ergebnis nur dann WAHR und somit 1, wenn die korrespondierenden Bits der beiden Zahlen ungleich sind, also entweder das eine oder das andere Bit gesetzt ist, sonst aber UNWAHR, also 0. Das entspricht der negierten Äquivalenzfunktion.
Im Gegensatz zu den BASIC-Befehlen AND, OR oder NOT, die auch Bitmanipulationen erlauben, handelt es sich hier nicht um einen Operator und kann so auch nicht direkt in einem logischen Ausdruck zur Formung einer Bedingung verwendet werden.
Ein weiterer Unterschied ist der Wertebereich der Parameter, der einen direkte Verwendung von XOR für logische Ausdrücke nicht erlaubt und für Bitmanipulationen nur eingeschränkt direkt kombiniert werden kann. Speziell Integer-Variablen können mit ihrem abweichenden Wertebereich nicht direkt verwendet werden. Für den Byte-Wertbereich bzw. allgemein für Werte im Bereich von 0 bis 32767 ist die gemischte Verwendung, abgesehen von der abweichenden Syntax, kein Problem.
Wenn die Parameter nicht im Zahlenbereich von 0 bis 65535 liegen, wird die BASIC-Fehlermeldung ?ILLEGAL QUANTITY ERROR ausgegeben.
Nicht ganzzahlige Angaben bei den Parametern werden entsprechend umgewandelt (auf die kleinste nächstliegende Ganzzahl gemäß Funktion INT).
Beispiele[Bearbeiten | Quelltext bearbeiten]
Wahrheitstabelle[Bearbeiten | Quelltext bearbeiten]
20 PRINT "X","Y","X XOR Y","X = Y" 30 FOR X= 0 TO 1 40 FOR Y= 0 TO 1 60 PRINT X,Y,XOR(X,Y),1-XOR(X,Y) 70 NEXT Y 80 NEXT X
gibt aus
X Y X XOR Y X = Y 0 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1
Bitmanipulation[Bearbeiten | Quelltext bearbeiten]
WAIT-Befehl nachprogrammiert ...
100 IF (XOR(PEEK(ADDRESS),FLIP) AND MASK) = 0 GOTO 100
XOR dient als Funktion zum "umdrehen" von Bits, hier: Die Bits in FLIP drehen die korrespondierenden Bits der ausgelesenen Speicherstelle um.
XOR in logischen Ausdrücken[Bearbeiten | Quelltext bearbeiten]
Funktionen wie AND, OR, NOT verwenden die Werte 0 und -1 für falsch und wahr und die dazu gehörigen Vergleichsoperatoren sind darauf abgestimmt. Möchte man XOR in diesem Kontext wie andere logische Operatoren verwenden müssen Parameter und auch das Ergebnis umgerechnet werden. Zwei vom Ergebnis gleichwertige Varianten sind möglich:
XOR(ABS(Bedingung1),ABS(Bedingung2)) = 1
-XOR(ABS(Bedingung1),ABS(Bedingung2))
Eleganter und auch schneller, da Ausdruck = 1 durch einen schlichten Vorzeichenwechsel ersetzt werden kann.
In einem Bespiel demonstriert (die 2. Variante verwendend):
Statt der hypothetischen Syntax
100 REM WENN XOR EIN OPERATOR UND KEINE FUNKTION WAERE ... 110 IF NOT( (A < B) XOR (X < Y) ) OR A = B THEN PRINT "TRIFFT ZU"
kann real verwendet werden:
100 REM XOR ALS FUNKTION ... 110 IF NOT(-XOR(ABS(A < B),ABS(X < Y))) OR A=B THEN PRINT "TRIFFT ZU"
Gibt "TRIFFT ZU" aus,
- wenn entweder beiden Pärchen A,B oder X,Y aufsteigende oder abfallende Werte haben (negiertes XOR = Äquivalenz) oder
- wenn A gleich B ist.
Umwandlung im Detail:
- Parameter mit Funktion "ABS()": Bereich 0|-1 ergibt 0|1
- Ergebnis mit Negation "-": Bereich 0|1 ergibt 0|-1
Letzteres ist speziell bei NOT() wichtig, da nur NOT(-1) 0 ergibt. Sonst ergäbe NOT(1) -2, was speziell für IF logisch gesehen trotzdem als WAHR angesehen wird.
XOR in BASIC 2.0[Bearbeiten | Quelltext bearbeiten]
XOR-Funktion nur mit BASIC 2.0 Befehle ...
Ausgehend davon, dass X und Y logische Werte 0 und -1 für "falsch" und "wahr" enthalten.
Die bitweise Variante mit AND, OR und NOT hergeleitet:
100 PRINT (X AND NOT Y) OR (NOT X AND Y)
oder umgeformt gleichbedeutend mit
100 PRINT (X OR Y) AND NOT(X AND Y)
entspricht der schnelleren, optimierten Variante
100 PRINT (X OR Y)-(X AND Y)
Oder für logische Ausdrücke:
100 IF NOT(X=Y) THEN PRINT "WAHR" : GOTO 120 110 PRINT "FALSCH" 120 REM
APPEND | BANK | BEGIN | BEND | BLOAD | BOOT | BSAVE | BUMP | CATALOG | COLLISION | COLOR | CONCAT | DCLEAR | DCLOSE | DOPEN | DVERIFY | ENVELOPE | FAST | FETCH | FILTER | GO64 | MOVSPR | (OFF) | PEN | PLAY | POINTER | POT | (QUIT) | RECORD | RREG | RSPCOLOR | RSPPOS | RSPRITE | RWINDOW | SLEEP | SLOW | SOUND | SPRCOLOR | SPRDEF | SPRITE | SPRSAV | STASH | SWAP | TEMPO | WIDTH | WINDOW | XOR