XOR

Aus C64-Wiki
Zur Navigation springenZur Suche springen
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:

  1. XOR(ABS(Bedingung1),ABS(Bedingung2)) = 1
  2. -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:

  1. Parameter mit Funktion "ABS()": Bereich 0|-1 ergibt 0|1
  2. 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