![]() |
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? |
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 |
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:
Chris
iFlag = C_BASE or C_FLAG1;
// ... if (iFlag and C_FLAG1) then begin // ... end else if (iFlag and C_FLAG2) then begin // ... end; |
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 |
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:
Man muesste also bei der Auswertung die Nullen als "true" (=gesetzte Option) betrachten und Einsen als "false":
const
OptionA=1110; OptionB=1101; begin // OptionC <=> OptionA und OptionB sind gewuenscht OptionC:=OptionA and OptionB; // 1110 and 1101 = 1100 end;
Code:
OptionAGewuenscht:=not(OptionC or OptionA) >0
|
Re: Warum "OR" und nicht "AND" ?
Zitat:
Keine Gute Idee:
Delphi-Quellcode:
Die sicherste Variante:
const
Foo = 1; Bar = 2; All = Foo or Bar; ... Bug := All + Foo;
Delphi-Quellcode:
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 ;)).
NoBug := All or Foo;
... if (NoBug and Foo) = Foo then Gruss Nico ps: 'or' und 'and' gehören zu einer andere Algebra und haben nichts mit + und - zu tun. |
Re: Warum "OR" und nicht "AND" ?
Zitat:
Code:
01 or 01 = 01 01 or 10 = 11
01 + 01 = 10 01 + 10 = 11 01 and 01 = 01 01 and 10 = 00 |
Re: Warum "OR" und nicht "AND" ?
Hi,
btw: 01+01 ist immer noch 02. ;) Chris |
Re: Warum "OR" und nicht "AND" ?
Zitat:
|
Re: Warum "OR" und nicht "AND" ?
Moin alcaeus,
Zitat:
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 03:59 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