AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitweise Operatoren

Ein Thema von THuman · begonnen am 31. Jan 2006 · letzter Beitrag vom 8. Sep 2006
Antwort Antwort
Seite 2 von 2     12   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 16:15
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#12

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 17:16
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?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 17:24
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 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 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#14

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 17:28
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 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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#15

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 17:29
Ah dank euch beiden
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 17:46
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#17

Re: Bitweise Operatoren

  Alt 7. Sep 2006, 18:38
Zitat von JasonDX:
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#18

Re: Bitweise Operatoren

  Alt 8. Sep 2006, 00:11
Danke euch beiden!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 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