Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Warum "OR" und nicht "AND" ? (https://www.delphipraxis.net/25677-warum-und-nicht.html)

Pseudemys Nelsoni 10. Jul 2004 12:00


Warum "OR" und nicht "AND" ?
 
hoi,

exakt dieses Thema hatte ich schonmal erstellt, kann es aber nichtmehr finden...

Also meine Frage nochmal, wieso verbindet man z.b 2 konstanten (meistens bei api funktionen) mit "OR" ? das müsste doch "AND"(und!) heissen oder nicht?

Christian S. 10. Jul 2004 12:04

Re: Warum "OR" und nicht "AND" ?
 
Hallo!

Die Verknüpfung der Konstanten ist ja nichts anderes als das bitweise verknüpfen zweier Integers. Nehmen wir an, Du hast die Konstanten CO_A und CO_B. In Binärdarstellung:

CO_A = 01
CO_B = 10

Wenn Du die nun bitweise mit AND verknüpfen würdest, bekämst Du ja 00 raus. Nur bei OR bekommst Du 11 raus, und das ist es, was Du haben willst, weil ja beides drin vorkommen soll!

MfG
Peter

CalganX 10. Jul 2004 16:31

Re: Warum "OR" und nicht "AND" ?
 
Hi,
wie Peter schon gesagt hat, hat das mit der Bit-Arithmetik zu tun.
Es kommt noch hinzu, dass du dann auch über prüfen kannst:
Delphi-Quellcode:
iFlag = C_BASE or C_FLAG1;

// ...

if (iFlag and C_FLAG1) then begin
  // ...
end else if (iFlag and C_FLAG2) then begin
  // ...
end;
Chris

alcaeus 10. Jul 2004 16:35

Re: Warum "OR" und nicht "AND" ?
 
Du musst nicht OR verwenden, du kannst sie ganz einfach addieren:
Diese Konstanten sind ja immer 2^n. Wenn du nun z.B. 10 und 01 OR-verbindest, erhälst du 11. Das ist eben das gleiche wie 10 + 01. Genau diese Eigenschaft ist der Grund, wieso 2er-Potenzen für diese Zwecke verwendet werden.

Greetz
alcaeus

BKempf 10. Jul 2004 16:44

Re: Warum "OR" und nicht "AND" ?
 
Waere mal lustig, das ganze so zurechtzubiegen, dass es mit "and" passt:
(Der Verstaendlichkeit halber: Zahlen sind binaer notiert)
Code:
const
  OptionA=1110;
  OptionB=1101;

begin
  // OptionC <=> OptionA und OptionB sind gewuenscht
  OptionC:=OptionA and OptionB;  // 1110 and 1101 = 1100
end;
Man muesste also bei der Auswertung die Nullen als "true" (=gesetzte Option) betrachten und Einsen als "false":

Code:
OptionAGewuenscht:=not(OptionC or OptionA) >0

NicoDE 10. Jul 2004 16:48

Re: Warum "OR" und nicht "AND" ?
 
Zitat:

Zitat von alcaeus
Du musst nicht OR verwenden, du kannst sie ganz einfach addieren:
Diese Konstanten sind ja immer 2^n.

Das sind sie nicht immer. Zudem gibt es dann Probleme mit Alias-Konstanten...

Keine Gute Idee:
Delphi-Quellcode:
const
  Foo = 1;
  Bar = 2;
  All = Foo or Bar;

...
  Bug := All + Foo;
Die sicherste Variante:
Delphi-Quellcode:
NoBug := All or Foo;
...
if (NoBug and Foo) = Foo then
Alles andere sind Optimierungen für die Falle, dass die Konstanten a) keine gemeinesamen Bits und b) jeweils nur ein Bit gesetzt haben (und man weiss was man tut ;)).


Gruss Nico

ps: 'or' und 'and' gehören zu einer andere Algebra und haben nichts mit + und - zu tun.

himitsu 10. Jul 2004 16:52

Re: Warum "OR" und nicht "AND" ?
 
Zitat:

Zitat von alcaeus
Du musst nicht OR verwenden, du kannst sie ganz einfach addieren:
Diese Konstanten sind ja immer 2^n. Wenn du nun z.B. 10 und 01 OR-verbindest, erhälst du 11. Das ist eben das gleiche wie 10 + 01. Genau diese Eigenschaft ist der Grund, wieso 2er-Potenzen für diese Zwecke verwendet werden.

Greetz
alcaeus

also bei 01 und 10 stimmt das ja noch, aber versuch das mal mit 01 und 01 :zwinker:

Code:
01 or 01 = 01     01 or 10 = 11
01  +  01 = 10     01  +  10 = 11
01 and 01 = 01     01 and 10 = 00

CalganX 10. Jul 2004 16:56

Re: Warum "OR" und nicht "AND" ?
 
Hi,
btw: 01+01 ist immer noch 02. ;)

Chris

NicoDE 10. Jul 2004 16:59

Re: Warum "OR" und nicht "AND" ?
 
Zitat:

Zitat von Chakotay1308
btw: 01+01 ist immer noch 02. ;)

btw: 01 or 01 ist immer noch 01. ;)

Christian Seehase 10. Jul 2004 17:06

Re: Warum "OR" und nicht "AND" ?
 
Moin alcaeus,

Zitat:

Zitat von alcaeus
Diese Konstanten sind ja immer 2^n.

das sind sie oft, aber nicht immer.
Manchmal handelt es sich auch schon um Kobinationen, und wenn Du die dann mit + verbindest kann es zu "interessanten" Effekten kommen (wie Nico ja schon demonstriert hat).

himitsu 10. Jul 2004 17:16

Re: Warum "OR" und nicht "AND" ?
 
Da ja von binär geredet wurde, hatte ich angenommen, das es wohl selbstvertändlich ist, das ich natürlich auch Binäre Werte mein und da ist 01 + 01 immer noch 10 @Chack :tongue:

CalganX 10. Jul 2004 17:22

Re: Warum "OR" und nicht "AND" ?
 
Hi,
natürlich ist im binären 2 = 01. ;)
Allerdings hatte ich alcaeus so verstanden, dass er von dezimalen Zahlen spricht. :tongue: Allerdings kommt das gleiche Ergebnis raus: es funktioniert nicht (immer). ;)

Chris

alcaeus 10. Jul 2004 17:24

Re: Warum "OR" und nicht "AND" ?
 
Zitat:

Zitat von Chakotay1308
natürlich ist im binären 2 = 01. ;)

:gruebel: :wiejetzt: Das ist jetzt wahrscheinlich zu hoch für mich.
[OT]
Es gibt 10 Arten von Menschen: Die, die den Binärcode verstehen und die, die ihn nicht verstehen.
[/OT]

Greetz
alcaeus

SirThornberry 10. Jul 2004 17:53

Re: Warum "OR" und nicht "AND" ?
 
@alcaeus: Du musst den Smilie hinter "natürlich ist im binären 2 = 01." beachten.
Es handelt sich dabei natürlich um eine falschaussage. die zahl 2 ist im binärsystem "10"

CalganX 10. Jul 2004 17:54

Re: Warum "OR" und nicht "AND" ?
 
:wall: Sorry. Tippfehler 2 = 10.. so rum... :wall:

[edit]Eigentlich war es ein Tippfehler, SirT. ;) Aber egal. Interpretier es wie du willst, es kommt auf's gleiche heraus. *g*[/edit]

w3seek 10. Jul 2004 20:32

Re: Warum "OR" und nicht "AND" ?
 
Am besten kann man sich das denke ich mit der Mengenlehre vor Augen fuehren...

Pseudemys Nelsoni 11. Jul 2004 12:09

Re: Warum "OR" und nicht "AND" ?
 
hallo leute,

ich muss ehrlich sagen das ich es immernoch nicht kapiere...

wieso ist: "01 and 10 = 00" ? für mich wäre das ergebnis "11"....hmm

gibts da irgendwo ne seite zu mit dem thema?

CalganX 11. Jul 2004 12:11

Re: Warum "OR" und nicht "AND" ?
 
Hi,
suche mal bei Bei Google suchenGoogle. ;)

Chris

neolithos 11. Jul 2004 12:19

Re: Warum "OR" und nicht "AND" ?
 
Zitat:

Zitat von Pseudemys Nelsoni
ich muss ehrlich sagen das ich es immernoch nicht kapiere...

Da gibt es ja auch nichts zu kapieren! Das wurde mal so festgelegt und seitdem macht man das so!

Mal die Regeln:
Code:

  x   y  x and y  x or y  x xor y
-------------------------------------
  0    0      0        0         0
  0    1      0        1         1
  1    0      0        1         1
  1    1      1        1         0
EDIT: Mein Alter DV-Lehere hat immer gesagt:
"Das muss man nicht begreifen, dass muss man wissen!
Und wer sich das nicht merken kann, ist hier falsch!" (Leistungskurs DV hat er da gemeint)

sakura 11. Jul 2004 12:22

Re: Warum "OR" und nicht "AND" ?
 
Das ist genauso wie in der Umgangssprache. Stellen wir uns mal vor, Du möchtest mit Freunden spielen gehen. Also RAUSGEHEN soll TRUE werden. Deine Mutter sagt: Du darfst nur RAUSGEHEN, wenn Du Deine Hausaufgaben machst UND den Müll rausbringst

Nur wenn Hausaufgaben erledigt True (1) ist
und wann Müll draussen True (1) ist
dann geht auch Rausgehen auf True (1)

:zwinker:

...:cat:...

negaH 11. Jul 2004 13:13

Re: Warum "OR" und nicht "AND" ?
 
Boolsche Algebra heist das eine Operation mit ZWEI Operanden nur EIN Resultat liefert.

Du verwechselst das OR/AND mit dem sprachlichen Oder/Und, aber OR/AND haben damit NICHTS zu tun.

Für dich ist 12 Euro UND 13 Euro = 25 Euro du setzt für das UND das PLUS ein.
Beim ODER klappt dies dann nicht mehr denn 12 Euro ODER 13 Euro sind ?? Aus Zwei Operanden entstünden ein Resultat mit ZWEI Werten !!.

Boolsche Algrebra sagt aber:

Wenn Schalter A = ein UND Schalter B = ein dann Lampe leuchtet.
Wenn Schalter A = aus UND Schalter B = ein dann Lampe dunkel.
Wenn Schalter A = aus UND Schalter B = aus dann Lampe dunkel.
Wenn Schalter A = ein UND Schalter B = aus dann Lampe dunkel.

Somit sind Schalter A und Schalter B in Reihe geschaltet. Schalter A UND Schalter B müssen ein sein damit die Lampe leuchtet.

Wenn Schalter A = ein ODER Schalter B = ein dann Lampe leuchtet.
Wenn Schalter A = ein ODER Schalter B = aus dann Lampe leuchtet.
Wenn Schalter A = aus ODER Schalter B = ein dann Lampe leuchtet.
Wenn Schalter A = aus ODER Schalter B = aus dann Lampe dunkel.

Somit eine Paralellschaltung der Schalter. Einer ODER beide Schalter können ein sein damit die Lampe leuchtet.

Du möchtest nun verschiedene BITs vermischen, du möchtest also das im Resultat die entsprechenden Flags als geminesamme Summe aller gesetzt sind. Dies ist eine ODER Operation.

Dein Denkfehler liegt also darin das du die Operatoren AND/OR der Boolschen Algrebra mit den Operatoren +/- der normalen Algebra verwechselst. Anders ausgedrückt: du verstehst nicht die Boolsche Algebra und setzt alles mit deiner Normalmathematik gleich.


Gruß Hagen

Pseudemys Nelsoni 19. Okt 2004 01:15

Re: Warum "OR" und nicht "AND" ?
 
ich glaub ich werds nichtmehr schnallen *g* aber trotzdem nochmal ne frage:

Zitat:

Für dich ist 12 Euro UND 13 Euro = 25 Euro du setzt für das UND das PLUS ein.
Beim ODER klappt dies dann nicht mehr denn 12 Euro ODER 13 Euro sind ?? Aus Zwei Operanden entstünden ein Resultat mit ZWEI Werten !!.

wieso entstünden da 2 werte? für mich würde da kein wert entstehen weil ein ODER einfach nicht möglich für mich ist

fiasko 19. Okt 2004 06:11

Re: Warum "OR" und nicht "AND" ?
 
Hallo,

Zitat:

Zitat von Pseudemys Nelsoni
wieso ist: "01 and 10 = 00" ? für mich wäre das ergebnis "11"....hmm

erstmal mußt du klähren wie das and definiert ist. In Pascal kann man das and sowohl für bitweises als auch logisches UND verwenden. Bitweise heißt man behandlet jede Bit-stelle für sich, also in dem Falle wäre das für das 0. Bit 1 and 0 = 0 und für das 1. Bit 0 and 1 = 0. Was bei den 4 möglichen Bitvariationen für eine bestimmte Operation (wie z.B. and) rauskommt ist in Wahrheitstabellen definiert - und was DU darunter verstehst muß nicht zwangsläufig mit anderen übereinstimmen - es sind definitionen und die kann jeder halten wie ein Dachdecker :mrgreen:.

Dann gibt es noch das logische and, welches nur die boolischen Werte vergleicht, also bei and ob beide Seiten true sind. Das ist in Pascal bißchen verschwommen und mehr in C ähnlichen Sprachen verbreitet - dort gibt es extra unterschiedliche Operatoren dafür.

negaH 19. Okt 2004 07:16

Re: Warum "OR" und nicht "AND" ?
 
Hm, @fiasko: du machst das jetzt komplizierter als es ist.

In fact gibt es eben keinen Unterschied zwischen der einem "bitweisen" und "logischen" UND. Beides ist identisch. Der einzigste Unterschied ist die Frage nach der benutzen Menge. Während eine "logisches" UND, das was du als einfache boolsche Verknüpfung eines Bits mit JA/NEIN vestehst, eben nur ein Ja/NEIN Kanal darstellt, sind bei Bitweisen Verknüpfungen von zb. Bytes/Integers usw. einfach 8/16/32 solcher "Kanäle" vorhanden.

Betrachten wir also die kleinste mögliche Menge in der Boolschen Algebra -> das Bit.
Ein Bit kann nur zwei Zustände speichern -> False oder True, 0 oder 1, Falsch oder Wahr, Aus oder Ein.

Die Frage nach dem UND -> AND, ODER -> OR usw. zielt nun auf die Rechenoperationen in der Boolschen Algebra ab. So wie es in der normalen Algebra die Addition, Subtraction usw. von natürlichen Zahlen gibt.

Die Eingangsfrage bezog sich auf ein Denkproblem, in dem eben diese verschiedenen Operationen übergreifend übertragen wurden, was aber definitiv falsch ist.

UND/AND bedeutet das bei Operanden TRUE sein müssen damit das Resultat ebenfalls TRUE ergibt.
ODER/OR bedeutet das einer der beiden Operanden oder beide TRUE sein können damit das Resultat TRUE ergibt.

Das UND/AND bezieht sich eben nicht auf ein UND wie in dem Satz: "ich habe 1000 Euro und 2000 Dollar auf meinem Konto". Der Denkfehler liegt darin den allgmeinen Sprachgebrauch des UND/AND Wortes in die Boolsche Algebra übertragen zu wollen.


Zitat:

wieso entstünden da 2 werte? für mich würde da kein wert entstehen weil ein ODER einfach nicht möglich für mich ist
Sehr gut, den ersten Schritt hast du nun getan, und du hast erkannt das die ODER Operation eben nicht anwendbar ist. Das gleiche gilt für jede Boolsche Operation die du "gedanklich" falsch in die normale Arithmetik mit natürlichen Zahlen übertragen willst.

Wenn du 3 + 2 addierst dann kommt 5 raus, eben weil 3,4,5 Zahlen sind.
Wenn du 3 or 2 oder verknüpfst dann kommt 3 raus, eben weil 3,2 Bitfelder sind, sozusagen Boolsche Mengen in parallel.

Code:
                                            3210
Die 3 wird im Rechner binär gespeichert als 0011.
Die 2 wird im Rechner binär gespeichert als 0010.
                                            ---- 
Oder verknüpft ergib das                   0011 -> 3
                                            ---- 
Und verknüpft ergibt das                   0010 -> 2
Betrachte obige Bits mal als Spalten-Operation von Rechts nach Links.
Es gibt die Spalten 0,1,2,3 -> darunter die Bitzustände für jeweils die Zahlen 3 und 2.

Die Spalte gibt die Wertigkeit des Bits ansich an. Also Spalte
0 -> 2^0 == 1
1 -> 2^1 == 2
2 -> 2^2 == 4
3 -> 2^3 == 8

Wenn das jeweilige Bit in der Spalte 1 ist wird dessen Wertigkeit addiert, und somit kommt man bei der binären Darstellung der Zahl 3 -> 0011 auf 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0.

Wird aber nun Boolsch verküpft interessierten an diesen Zahlen 3,2 eben nur die Bits der einzelnen Spalten UNABHÄGNIG von den restlichen Spalten. Man wendet also die Boolschen Operation immer nur auf eine Bitspalte mit gleicher Wertigkeit an.

Im obigen Beispiel eine Oder Verküpfung geht man die Spalten 0,1,2,3 von Rechts nach Links durch und wendet das OR für die einzlenen Bits der Zahlen 3 und 2 an.


Code:
         Zahl 3      Zahl 2   resulat
Spalte
   0       1     or   0        1
   1       1     or   1        1
   2       0     or   0        0 
   3       0     or   0        0

ergibt: 0011 -> 3

         Zahl 3      Zahl 2   resulat
Spalte
   0       1     and  0        0
   1       1     and  1        1
   2       0     and  0        0 
   3       0     and  0        0

ergibt: 0010 -> 2
AND -> UND -> Im Resultat steht nur eine 1 wenn im Operand A und B eine 1 steht.
OR -> ODER -> Im Resultat steht eine 1 wenn im Operand A oder B oder A und B eine 1 steht.
NOT -> NICHT -> Im Resulat steht eine 1 wenn im Operand eine 0 steht.


Die Worte UND,ODER,NICHT,OR,AND,NOT,XOR stellen also keine semantischen Worte wie du sie normalerweise benutzt dar, sondern sind wie +,-,*,/ einfach mathematische Operationen. Wenn +,-,*,/ Rechenoperation mit natürlichen Zahlen sind, also in der Arithmetik, dann sind AND,OR,NOT,XOR eben die Rechenoperationen in der Boolschen Algebra. UND bedeutet also nicht +.

Gruß Hagen

Pseudemys Nelsoni 19. Okt 2004 11:59

Re: Warum "OR" und nicht "AND" ?
 
danke Hagen,

ich glaub nun versteh ichs *g*, nun aber nochmal eine andere frage, wozu gibt es diese "art" der rechnung? ich meine würde das ganze mit z.b +,- etc nicht reichen? ich würde glaub ich immer erst rechnen müssen was überhaupt bei so einer binären rechnung rauskäme.

Danke für deinen Text :)

Dax 19. Okt 2004 12:01

Re: Warum "OR" und nicht "AND" ?
 
Warum es OR gibt? Einfach:
Code:
11 OR
10 ==
11
Wohingegen
Code:
11 +
10 ==
101
Bitweise und arithmetische Operatoren unterscheiden sich also.

Pseudemys Nelsoni 19. Okt 2004 12:03

Re: Warum "OR" und nicht "AND" ?
 
schon, aber statt:

Zitat:

10 or 11
könnt ich doch auch einfach:

Zitat:

10 + 1
rechnen.

Dax 19. Okt 2004 12:04

Re: Warum "OR" und nicht "AND" ?
 
Du weisst aber nicht immer, welche Bits gesetzt sind. Mein Beispiel kommt durchaus mal in API-basierten Programmen vor, wenn du dort + neutzen würdest, hättest du am Ende ein Rahmenloses Fenster statt einem Fenster mit extradicken Rand. Um herauszufinde, welche Bits gesetzt sind und welche nicht brauchst du diese Bitweisen Operatoren.

Sanchez 19. Okt 2004 12:11

Re: Warum "OR" und nicht "AND" ?
 
Nehmen wir mal an, du hast einen Wert von 0 bis 255, also 8bit.
Du willst jetzt z.B. das 7te Bit auf High setzen ohne die restlichen Bits zu beeinflussen.

Code:
10010101 or
01000000 =

11010101
oder auch in Delphi
Delphi-Quellcode:
  Wert := Wert or (1 shl 6);
Mit Addition würdest du es schwer haben.

grüße, daniel

Sharky 19. Okt 2004 12:15

Re: Warum "OR" und nicht "AND" ?
 
Hai Pseudemys,
nehmem wir doch mal andere Zahlen :stupid:

Code:
    5 = 0101 
    3 = 0011

    5 = 0101 
+   3 = 0011
    --------
    8 = 1000

    5 = 0101 
OR 3 = 0011
    --------
    7 = 0111

    5 = 0101 
AND 3 = 0011
    --------
    1 = 0001

negaH 20. Okt 2004 11:00

Re: Warum "OR" und nicht "AND" ?
 
Nochwas ist mir aufgefallen.

Wenn es um die Angabe eines Bits in einem Bitfeld -> Integer/Cardinal usw. geht sollte man deren Index IMMER 0-basiert angeben.

Also, ein byte besteht aus 8 Bits mit den Indizes 0 bis 7. Das unterste Bit in desem Byte hat also Index 0 unddas höchstwertige Bit hat 7.

Desweiteren stellt man eine binärzahl immer von Rechts nach Links dar. Die Zahl $85 = 133 = 10000101b. D.h. die Bitindizes dieser Zahl im Binärdarstellungen sind so:


Code:
76543210
10000101
Warum ? weil

10000101 = 133 = (1 * 2^7) or (1 * 2^2) or (1*2^0)

ist. Man sieht also das der Bit Index (0 bis 7) identisch zur Bit-Wertigkeit -> 2^BitIndex ist. Diese beiden Regeln vereinfachen die komplete Denklogik.

Zudem ist es per Definition einfach falsch das das niederwertigste Bit in einem Byte das Bit mit Index 1 ist. Es gibt ganz klare mathematische Definitionen das man mit dem Index 0 beginnt.

Auch schreibt man immer von "Rechts nach Links" zahlen, selbst unsere Dezimalzahlen werden zB. 133 statt 331 geschrieben, also ist 8 -> 1000 binär und nicht 0001.

Warum man nun Bitmengen -> Boolsche Mengen benutzt ?
Ganz enfach weil die zB. Menge "Farben" auch nur aus den Elementen "Rot", "Grün", "Blau" besteht.
Und Bitcodiert Flags eben eine Menge aus verscheiden Flags darstellen. Der Zahlenwert einer solchen Bitkonstante bestimmt im Grunde deren vorher schon ausgerechneten Wertigkeit des Bits.

Also angenommen wir haben eine Flag-Menge mit

Delphi-Quellcode:
const
  Rot = 0;
  Grün = 1;
  Blau = 2;

var
  Flag: Byte -> (Rot, Grün, Blau)
Die Konstanten für Rot, Grün, Blau stellen die Mengen-Wertigkeit dar. Da diese Mengen-Wertigkeit in einem Flag vom Typ Byte gespeichert werden sollen, sind die Mengen-Wertigkeiten identisch zur den Bit-Indizes. Also:

Delphi-Quellcode:
  Flags := 2^Rot or 2^Grün or 2^Blau; // Flags enthält nun Rot + Grün + Blau

-> oder eben
 
  Flags := (1 shl Rot) or (1 shl Grün) or (1 shl Blau)

-> predefiniert um das shl zu sparen also

const
  Rot = 1 shl 0; // Bit an Index 0 == 2^0 == 1
  Grün = 1 shl 1; // Bit an Index 1 == 2^1 == 2
  Blau = 1 shl 2; // Bit an Index 2 == 2^2 == 4
  Gelb = 1 shl 3; // Bit an Index 3 == 2^3 == 8
  Grau = 1 shl 4; // Bit an Index 4 == 2^4 == 16
D.h. im Windows API hat der Programmierer die Bitwertigkeit eines Flags schon im vorhinein ausgerechnet und als Zahl dargestellt. In Wirklichkeit sind es aber KEINE Zahlen sondern Mengen-Elemente.
Nun, die Kombination und Rekombination von Mengen-Elemente dürfen NICHT dazu führen das sich die Kardinalität der Menge verändert !!

Beispiel:

Delphi-Quellcode:
  Farbe := Rot or Grün;
// alles Korrekt, da Farbe Rot und Grün enthält
 
  Farbe := Farbe or Blau;
// immer noch alles korrekt

  Farbe := Farbe + Rot;  
// FALSCH !! Farbe war voeher 0111b nun aber 1000b
// Farbe müsste aber immer noch Rot,Grün,Blau sein ist es aber nicht denn sie ist Gelb = 2^3 = 8.
// richtig wäre also

  Farbe := Farbe or Rot;
Im obigen Beispiel wurde also die Operation + in einer Bitcodierten Menge angewednet und diese führte zu Fehlern.

Nun aber man weg vom C++ API Shit hin zu dem Weg wie man es in einer richtige Programmiersprache machen sollte. Ich schlage mal als richtige Programmiersprache die Sprache PASCAL vor, also Delphi:

Delphi-Quellcode:
 
type
  Farben = (rot, grün, blau, gelb, grau];
  Farbe = set of Farben;

var
  Flag: Farbe;
begin
   
  Flag := [rot grün];
  Flag := Flag + blau;
  Flag := Flag + rot;
 
  ShowMessage( IntToBin( Byte( Flag ) ) );
end;

Wie du siehst bei Mengen, die intern auch nur Bitcodiert gespeichert werden, wird eine gute Sprache auch die in der Mathematik üblichen Operationen +,-,* der Mengenlehre benutzen.

Wenn du also auf diese Operatoren bestehen willst dann benutze auch die Typdeklarationen zur Deklatration von Mengen.

Auf reiner Computer Ebene sind nämlich die Mengenoperation "+" identisch mit der Bitoperation OR, die Operation "-" mit der Operation AND NOT, die Operation "*" mit der Operation AND.


Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz