Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
Seite 1 von 4  1 23     Letzte »    

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