Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bitweise Operatoren (https://www.delphipraxis.net/62157-bitweise-operatoren.html)

THuman 31. Jan 2006 15:56


Bitweise Operatoren
 
Hallo,
ich versuche gerade bitweise Operatoren in Delphi zu benutzen, aber ich bekomme es nicht richtig hin.
So soll es in etwa "aussehen":
Delphi-Quellcode:
const
  flagA = 2;
  flagB = 4;
  flagC = 8;

var flags: integer;

flags := flagA + flagB;
IF (flags AND flagA) THEN ..
Es erscheint immer der Fehler "Ausdruckstyp muss Boolean sein" für die Zeile,in der das then steht.

Wäre nett, wenn mir damit jemand helfen könnte
Danke!

xaromz 31. Jan 2006 15:59

Re: Bitweise Operatoren
 
Hallo,
Delphi-Quellcode:
IF (flags AND flagA) = flagA THEN ..
So stimmt's.

Gruß
xaromz

THuman 31. Jan 2006 16:15

Re: Bitweise Operatoren
 
Danke für die schnelle Antwort, jetzt funktioniert es!

Christian Seehase 31. Jan 2006 17:21

Re: Bitweise Operatoren
 
Moin THuman,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Was mir an Deinem Code noch aufgefallen ist:

Delphi-Quellcode:
flags := flagA + flagB;
Du solltest bei Flags niemals mit + (oder evtl. -) arbeiten, nur mit OR bzw. AND, da Du die Zahlenwerte nicht immer kennen kannst, und es durchaus die Möglichkeit gibt, dass ein Flag mehrere gesetzte Bits hat.
Dann kann es bei normalen arithmetischen Operatoren zu unvorhersagbaren Ergebnissen kommen.

THuman 1. Feb 2006 17:49

Re: Bitweise Operatoren
 
Ok, danke für den Tipp! Dazu habe ich auch noch was in einem älteren Thread gelesen.

Glühwürmchen 7. Sep 2006 14:03

Re: Bitweise Operatoren
 
sorry,

wie kann man einen eigenen Beitrag wieder löschen ? :oops:

Dax 7. Sep 2006 14:07

Re: Bitweise Operatoren
 
Zitat:

Zitat von Glühwürmchen
sorry,

wie kann man einen eigenen Beitrag wieder löschen ? :oops:

Garnicht. Wobei ich nicht mal finde, das du dich entschuldigen müsstest. Dein Beitrag war durchaus konstruktiv und stellte nur eine Alternative zu xaromz' Vorschlag dar.

Glühwürmchen 7. Sep 2006 14:20

Re: Bitweise Operatoren
 
Das bruhigt mich einigermaßen.
Ich kam nämlich beim Schreiben mächtig durcheinander...


Zu dem Thema bitweise "operieren" hätte ich jetzt auch noch ne Frage:

Delphi-Quellcode:
iKlein := 1;
iGross := 9;
Ist es egal ob ich schreibe

Delphi-Quellcode:
IF iKlein AND iGross > 0 THEN ...
oder

Delphi-Quellcode:
IF iGross AND iKlein > 0 THEN ...
?

brechi 7. Sep 2006 14:24

Re: Bitweise Operatoren
 
Ja ist es. Da beim Ergebnis nur noch die Bits gesetzt sind, die bei beiden gesetzt waren.

Glühwürmchen 7. Sep 2006 14:26

Re: Bitweise Operatoren
 
Danke.

Eigentlich wußte ich das schon mal.
Aber neulich versuchte ich das Bitweisige Operieren meinem Cheffe näher zu bringen mit dem Erfolg, daß er mich Bit für Bit verunsichert und durcheinander gebracht hat. ;-)

Jetzt sehe ich aber wieder klar.

Christian Seehase 7. Sep 2006 15:15

Re: Bitweise Operatoren
 
Moin Glühwürmchen,

ich würde Dir allerdings empfehlen bei solchen Abfragen auf <> 0 zu testen, da das Ergebnis theoretisch auch negativ sein kein.
(auch wenn das für Deinen konkreten Fall nicht zutrifft.

Mackhack 7. Sep 2006 16:16

Re: Bitweise Operatoren
 
Hm,

welches Wort (AND, OR,...) entspricht denn einem + und einem -?

Was ich fragen will ist z. B. aus der MSDN heraus. Wann weis ich eigentlich wann ich mehrere z. B. dwNotifyFilter bei ReadDirectoryChangesW verbinden kann kann mit Or?

Christian Seehase 7. Sep 2006 16:24

Re: Bitweise Operatoren
 
Moin Mackhack,

mit OR fügst Du Bitwerte zusammen, und mit AND kannst Du dann die Bits testen.
Bei Bitfeldern niemals mit + oder - arbeiten, da dies ungültige Werte erzeugen kann, die dann zu unverhersagbaren Ergebnissen führen können.

Zitat:

Zitat von Mackhack
Wann weis ich eigentlich wann ich mehrere z. B. dwNotifyFilter bei ReadDirectoryChangesW verbinden kann kann mit Or?

Wenn in der Dokumentation so etwas steht wie: ... one or more ...

Beispiel:

Zitat:

Zitat von PSDK - ReadDirectoryChangesW
dwNotifyFilter
[in] Filter criteria the function checks to determine if the wait operation has completed. This parameter can be one or more of the following values.


JasonDX 7. Sep 2006 16:28

Re: Bitweise Operatoren
 
Zitat:

Zitat von Mackhack
welches Wort (AND, OR,...) entspricht denn einem + und einem -?

x = a + b entspricht x = a or b
x = a - b entspricht x = a and not b

Zitat:

Zitat von Mackhack
Was ich fragen will ist z. B. aus der MSDN heraus. Wann weis ich eigentlich wann ich mehrere z. B. dwNotifyFilter bei ReadDirectoryChangesW verbinden kann kann mit Or?

Dies sollte in der Dokumentation so vermerkt sein, dass man sieht, welche Kombinationen von Flags erlaubt sind. Normalerweise ist es aber auch schon vom logischen Aspekt her offensichtlich.

greetz
Mike

Mackhack 7. Sep 2006 16:29

Re: Bitweise Operatoren
 
Ah dank euch beiden

Christian Seehase 7. Sep 2006 16:46

Re: Bitweise Operatoren
 
Moin Mackhack,

umgang mit Bitfeldern allgemein, am Beispiel des Feldes Style aus CreateWindow, bzw. GetWindowLong, um den Wert auszulesen:

(Das Beispiel erhebt nicht den Anspruch sinnvoll zu sein ;-))


Delphi-Quellcode:
var
  dwStyle : DWORD;

begin
  // Windowstyle (siehe CreateWindow) des durch Handle angegebenen Fensters auslesen
  dwStyle := GetWindowLong(Handle,GWL_STYLE);
 
  // Den Style WS_CAPTION hinzufügen, egal, ob dieser schon enthalten ist oder nicht
  dwStyle := dwStyle OR WS_CAPTION;

  // Alle Bits Löschen, die für den Style WS_DISABLED zuständig sind
  // Alle übrigen Bits bleiben erhalten
  // Dass heisst: Der Style WS_DISABLED wird entfernt
  dwStyle := dwStyle AND NOT WS_DISABLED;
 
  // Prüfen, ob der Style WS_SYSMENU gesetzt ist
  if (dwStyle AND WS_SYSMENU) <> 0 then ...
  // oder (gleichbeutend)
  if (dwStyle AND WS_SYSMENU) = WS_SYSMENU then ...

  // Man könnte auch schreiben
  // dwStyle := dwStyle AND WS_SYSMENU;
  // hierdurch würde man dafür sorgen, dass alle Werte ausser
  // WS_SYSMENU gelöscht werden.
  // WS_SYSMENU ist allerdings nur dann noch enthalten, wenn er vorher
  // auch schon enthalten war

  // ... und den neuen Wert setzen
  SetWindowLong(Handle,GWL_STYLE,dwStyle);
end;
Wichtig:
Es spielt bei der Verwendung OR/AND/NOT keine Rolle, wieviele Bits in den Werten gesetzt sind.
Beispielsweise gibt es auch zusammengesetzte Werte, wie GENERIC_READ (siehe CreateFile) die mehrere Werte zu einem neuen zusammenfassen, so dass man nicht alle Einzelwerte mit OR verknüpft selber schreiben muss.
Deshalb darf man diese Werte auch niemals addieren (+) oder subtrahieren (-), da es ansonsten durch Überträge zu falschen Bitmasken kommen kann (siehe auch in der Delphi-Hilfe das Beispiel zu FindFirst. So macht man es falsch), was zu völlig unverhersagbaren Ergebnissen führen kann, bishin zum Datenverlust.

Muetze1 7. Sep 2006 17:38

Re: Bitweise Operatoren
 
Zitat:

Zitat von JasonDX
Zitat:

Zitat von Mackhack
welches Wort (AND, OR,...) entspricht denn einem + und einem -?

x = a + b entspricht x = a or b
x = a - b entspricht x = a and not b

Na Hilfe - Wenn schon sowas hier geschrieben wird, dann aber unbedingt dazu erwähnen, dass dies nur gilt, wenn die Anweisung einmalig ausgeführt wird. Und genau da liegt auch der Grund für And/Or: Die kann man so oft machen wie man will, da werden nur die Bits gesetzt wenn nötig bzw. gelöscht wenn nötig. Das kann man so oft hintereinander machen wie man will, da ändert sich nix am Wert und bei + und - kommt da jedes mal ein anderer Wert raus. Und das beste dabei: dadurch werden auch alle anderen Bits mit verändert, obwohl man das gar nicht wollte.

Mackhack 7. Sep 2006 23:11

Re: Bitweise Operatoren
 
Danke euch beiden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.

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