Home » Tutorials » Object Pascal/RTL » Programmierung mit Boolean-Werten

Programmierung mit Boolean-Werten

Boolesche Logik – Grundlagen

„Wieso Boolesche Logik? Gibt es denn verschiedene Logiken?“, werden sich manche vielleicht fragen. Und ja, genauso ist es. Wer sich dafür interessiert, kann sich mal den entsprechenden Wikipedia-Artikel durchlesen. Hier soll es aber nur um die Boolesche Logik gehen, denn diese ist beim Programmieren entscheidend. Auch, wenn manches in der Booleschen Logik zuerst einmal ziemlich unlogisch aussieht, so gehört die Boolesche Logik zu den einfachsten. Man muss sich nur erst einmal daran gewöhnen…

Wahrheitswerte

In der Booleschen Algebra (~Boolesche Logik) gibt es nur 2 Werte: wahr und falsch, true und false, 1 und 0. Das vereinfacht so ziemlich alles kolossal (mathematisch gesehen zumindest):
Eine Aussage kann nicht „bis zu einem gewissen Grade“ wahr sein. Entweder eine Aussage ist wahr oder sie ist falsch.

Beispiele:

Aussagen, die wahr sind:

  • Das Wort ‚Delphi‘ fängt mit einem ‚D‘ an.
  • Wenn der Hahn kräht auf dem Mist, ändert sich’s Wetter oder’s bleibt, wie’s ist.
  • 2+2=4

Aussagen, die falsch sind:

  • Alle Wörter fangen mit einem ‚D‘ an.
  • Die Hähne bestimmen, wie das Wetter wird.
  • 2+2=5

Aussagen, die je nach gegebener Situation wahr oder falsch sein können:

  • Heute ist Montag.
  • Der Benzinpreis ist heute schon wieder gestiegen.
  • Mein Geburtstag fällt dieses Jahr auf einen Sonntag.

Aussagen, die weder wahr noch falsch sind und deshalb nicht Gegenstand der booleschen Algebra sind:

  • Wie viel Uhr ist es? (kein Wahrheitswert)
  • Delphi ist eine schöne Sprache. (subjektiv)
  • Delphi eignet sich gut, um zu programmieren. (Nur bis zu einem gewissen Grade richtig (was man immer dann werkt, wenn mal wieder jemand ein Betriebssystem in Delphi schreiben will…))

Mit Wahrheiten rechnen

Um nun mit diesen Wahrheitswerten zu rechnen, gibt es verschiedene Rechenoperationen: Nullfunktion, Konjunktion (and), Inhibit, Identität, Antivalenz (xor), Disjunktion (or), nor, Äquivalenz, Negation(not), Implikation, nand, …
Von diesen allen sollen und hier aber nur and, or, not, xor und die Äquivalenz interessieren.

and

Der resultierende Wahrheitswert ist genau dann wahr, wenn beide Werte wahr sind:

var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := False;
  if b1 and b2 then
    ... // wird nicht ausgeführt

or

Der resultierende Wahrheitswert ist genau dann wahr, wenn der eine oder der andere oder beide Werte wahr sind:

var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 or b2 then
    ... // wird ausgeführt

Das ist etwas anders als man es vom allgemeinen Sprachgebrauch her kennt. Mit or/oder ist das logische oder gemeint. Also nicht „entweder…oder“. Es können also auch beide Werte wahr sein.

not

Not invertiert einen Wahrheitswert. Aus True wird False und aus False True:

var
  b: Boolean;
begin
  b := False;
  if not b then
    ... // wird ausgeführt

Äquivalenz

Der resultierende Wahrheitswert ist genau dann wahr, beide Wahrheitswerte wahr oder beide falsch sind (also gleich).

var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 = b2 then
    ... // wird ausgeführt

xor

xor (Antivalenz, exklusives oder) ist nun das aus dem allgemeinen Sprachgebrauch bekannte „entweder…oder“. Der resultierende Wahrheitswert ist genau dann wahr, wenn entweder der eine oder der andere, nicht aber beide Werte wahr sind (also unterschiedlich):

var
  b1, b2: Boolean;
begin
  b1 := True;
  b2 := True;
  if b1 xor b2 then
    ... // wird *nicht* ausgeführt

Zu erwähnen ist vielleicht noch, dass man xor als Kombination von and und or darstellen kann:

a xor b 
//ist nichts anderes, als 
(a or b) and not (a and b)
// bzw:
(a and (not b)) or ((not a) and b)
// bzw:
a <> b

Logik-Minimierung

Am letzten Beispiel sieht man, dass die Darstellungen logischer Ausdrücke nicht eindeutig ist. Für ein und denselben Ausdruck gibt es immer viele Möglichkeiten der Darstellung. Manche sind einfach, andere komplex, und wieder andere sind kompliziert.
Manchmal kann es sinnvoll sein, komplexe (oder gar komplizierte) Boolsche Ausdrücke zu vereinfachen. Diesen Prozess nennt man Logik-Minimierung. Durch geschicktes Umformen können ganze Teilterme wegfallen, so dass sich ein komplizierter Ausdruck mitunter stark vereinfachen kann. Da dies aber nicht Gegenstand dieses Tutorials sein soll, sei hierzu auf den entsprechenden Wikipedia-Artikel verwiesen…

Bit-Operationen

Die Operatoren and, or, xor und not lassen sich auch mit Integer-Werten benutzen. Dann bezeichnen sie die so genannten Bit-Operatoren. Prinzipiell wird hier jedes einzelne Bit als Wahrheitswert interpretiert. Da das Resultat dann aber meist von dem abweicht, was der Programmier-Anfänger sich gedacht hat, stiftet dies des Öfteren Verwirrung. Bit-Oprationen werden oft bei Verschlüsselungen sowie in Verbindung mit Bitfeldern in der WinAPI (in C/C++ Ersatz für die dort fehlenden Mengentypen) u.ä. eingesetzt und spielen beim „normalen“ Programmieren im Vergleich zu den Boolean-Operatoren oft eine eher untergeordnete Rolle.