Grundlagen 1/10
Hintergrundwissen / Design und Tehnik
Logische Operatoren
Die logischen Operatoren von QB sind nicht vergleichbar mit logischen Operatoren einiger ander Sprachen, wie beispielsweise C, da die Operatoren bitweise arbeiten. Das heißt statt den ganzen Ausdruck auszuwerten wird jedes Bit einzeln verknüpft.
Es gibt sechs logische Operatoren in QB: 'NOT', 'OR', 'XOR', 'AND', 'EQV', 'IMP'. 'EQV' und 'IMP' verwende ich so gut wie nie. Trotzdem werde ich ihre Funktion erläutern. Doch zuerst zu dem Operator, der eine Ausnahme bildet: 'NOT'. Alle Operatoren bis auf diesen sind binäre Operatoren (benötigen zwei Operanden). Nur dieser ist unär (benötigt nur einen Operanden). Die Funktionsweise von 'NOT' ist eigentlich einfach. Jedes Bit, das auf '1' steht wird '0' und jedes Bit, das auf '0' steht wird '1'. (Bemerung am Rande: Das selbe erzielt man, wenn man 'Zahl * -1 - 1' rechnet.) Was hat man davon? Ganz einfach: Wenn man nur wissen will ob etwas stimmt oder nicht kann man 'NOT' wunderbar verwenden, da aus '0' '-1' und umgekehrt wird (weil bei '-1' alle Bits gesetzt sind und bei '0' keins). Die anfangs erwähnte Funktion 'IsVESA' aus der Future.Lib gibt '-1' zurück, wenn die Grafikkarte VESA-komppatibel ist. Also kann man schreiben:
IF NOT IsVESA THEN PRINT "Nicht VESA-kompatibel" END END IF
Der 'AND'-Operator
'AND' setzt immer wenn in beiden Ausdrücken ein Bit gesetzt ist eine '1' und sonst eine '0'. Wenn also zweimal die selbe Zahl mit 'AND' verknüpft wird, kommt wieder die selbe Zahl raus. Deswegen funktionieren auch Anweisungen wie 'IF a = 5 AND b = 6 THEN ...'. Wenn 'a' '5' und 'b' '6' sind ergeben die beiden Ausdrücke '-1' und -1 AND -1 ist '-1' also wahr. Aber wenn man Funktionen hat, die nur '-1' und '0' zurückgeben, kann man 'AND' auch so verwenden: 'IF IsVESA AND IsXMSInstalled THEN PRINT "Sie erfüllen alle Voraussetzungen"' oder 'IF a = 7 AND IsVESA THEN ...'. Mit 'AND' kann man auch herausfinden welches Bit einer Zahl gesetzt ist: 'Zahl AND 2 ^ Bit'. Um das zu verstehen sollten Sie sich ein Tutorium über Bitmanipulation durchlesen. Hier noch eine kleine Tabelle:
Ergebnis | Wert 1 | Wert 2 |
1 | 1 | 1 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 0 | 0 |
Der 'OR'-Operator
'OR' setzt eine '1', wenn eins der beiden Bits '1' ist. Das heißt, wenn einer der beiden Ausdrücke ungleich '0' ist ist das Ergebnis auch ungleich '0'. Z.B. 'IF a = 1 OR a = 4 THEN PRINT "a ist 1 oder 4"' oder 'IF IsXMSInstalled OR IsEMMInstalled THEN PRINT "EMS oder XMS ist installiert"'. (Was der unterschied zwischen EMS und XMS ist wird hier nicht erklärt und IsEMMinstaled ist kein Tippfehler, da das letzte M für Manager steht.)
Ergebnis | Wert 1 | Wert 2 |
1 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
Der 'XOR'-Operator
'XOR' setzt eine '1', wenn die beiden Bits unterschiedlich sind und sonst eine '0'. Das heißt man kann damit ein 'entweder oder' programmieren. Beispiel:
INPUT "Geben Sie eine Zahl größer und eine kleiner Null ein (z.B. 5, -7 oder -3, 6)"; a, b IF a < 0 XOR b < 0 OR a > 0 XOR b > 0 THEN PRINT "OK" ELSE PRINT "Ihre Eingabe ist fehlerhaft" END IF
Ergebnis | Wert 1 | Wert 2 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
'EQV' und 'IMP'
Bliebt noch der 'EQV' und der 'IMP' Operator. Wie gesagt verwende ich Sie nie. Wenn Sie interessiert sind bemühen Sie doch die Hilfe von QB. Ich jedenfalls bin bisher gut ausgekommen.
Anwendung
Selbst wenn Sie sich nicht alles merken können: Das Wichtigste (neben dem allgemein üblichen Gebrauch der logischen Operatoren) ist, dass Sie mit NOT eine Variable zwischen '-1' und '0' hin und herschalten können.
Für alles weitere sollten Sie sich ein Tutorium zum Thema Bimanipulation durchlesen. Dann können sie lustige Dinge tun, wie das folgende: Wenn man eine Liste überprüft, ob mehreren Begriffe vorkommen, kann man mit 'OR' mehrere Ergebnisse in einer Variable speichern und Sie anschließend einzeln mit 'AND' wieder auslesen. Wenn gesucht wird, ob in einem Datenfeld der Wert '4', der Wert '7' und der Wert '25' vorkommt, kann man das so machen:
DIM feld(...) AS INTEGER ' Zuweisungen von Werten FOR i = 0 TO UBOUND(feld) ergebniss = ergebniss OR 1 * -(feld(i) = 4) ergebniss = ergebniss OR 2 * -(feld(i) = 7) ergebniss = ergebniss OR 4 * -(feld(i) = 25) NEXT IF ergebnis AND 1 THEN PRINT " 4 kam vor" IF ergebnis AND 2 THEN PRINT " 7 kam vor" IF ergebnis AND 4 THEN PRINT "25 kam vor"
Nur zur Erklärung. Die FOR-Schleife macht das selbe wie diese hier
FOR i = 0 TO UBOUND(feld) IF feld(i) = 4 THEN ergebniss = ergebniss OR 1 IF feld(i) = 7 THEN ergebniss = ergebniss OR 2 IF feld(i) = 25 THEN ergebniss = ergebniss OR 4 NEXT