Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitweise Operatoren von C++ in Delphi übersetzen (https://www.delphipraxis.net/142522-bitweise-operatoren-von-c-delphi-uebersetzen.html)

MisterNiceGuy 29. Okt 2009 17:49


Bitweise Operatoren von C++ in Delphi übersetzen
 
Hi, ich sitze gerade an folgender If-Bedingung die ich von C++ in Delphi übersetzen möchte:

Code:
(m_dwUsage & D3DUSAGE_DYNAMIC) ? D3DLOCK_DISCARD : 0
Ich kann das ganze schon folgendermaßen auflösen:

Delphi-Quellcode:
if (m_dwUsage AND D3DUSAGE_DYNAMIC) then
  result := D3DLOCK_DISCARD
else result := 0;
So, jetzt muss ich nurnoch das m_dwUsage AND D3DUSAGE_DYNAMIC verstehen... Weiß jemand wie ich das übersetze?

FYI: m_dwUsage ist vom Typ DWORD.

Apollonius 29. Okt 2009 17:51

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Einfach <> 0 ergänzen. In C kann man das weglassen.

DeddyH 29. Okt 2009 17:51

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Delphi-Quellcode:
if (m_dwUsage AND D3DUSAGE_DYNAMIC) = D3DUSAGE_DYNAMIC then
  result := D3DLOCK_DISCARD
else result := 0;

MisterNiceGuy 29. Okt 2009 17:52

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Echt? Das wär ja wunderbar einfach ;) Danke!

himitsu 29. Okt 2009 18:35

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Code:
x = (m_dwUsage & D3DUSAGE_DYNAMIC) ? D3DLOCK_DISCARD : 0;
Delphi-Quellcode:
x := IfThen(m_dwUsage and D3DUSAGE_DYNAMIC <> 0, D3DLOCK_DISCARD, 0);

himitsu 29. Okt 2009 18:39

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Zitat:

Zitat von MisterNiceGuy
Echt? Das wär ja wunderbar einfach ;) Danke!

Welchen Wert haben eigentlich diese Konstanten?
Gibt da eventuell noch 'nen anderen "Trick".

schöni 29. Okt 2009 21:37

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
Hallo,

Zitat:

Zitat von hinitsu
Welchen Wert haben eigentlich diese Konstanten?
Gibt da eventuell noch 'nen anderen "Trick".

Das könnte so sein (Prinzip ist wichtig, nicht der wirkliche Wert der Konnstanten):

Delphi-Quellcode:
const
  m_dwUsage        = $00080;
  D3DUSAGE_DYNAMIC = $00081;

  //Die und Verknüpfung ergibt das:
  //                  01000
  //                  01001
  //                  -----
  //                  01000
Damit aber eine Abfrage sinnvoll ist, muss m_dwUsage nicht eine Konstante, sondern eine Variable im Programm sein, die also verschiedene Werte annehmen kann. In meinem Beispiel wäre die Bedingung erfüllt, wenn Bit 3 gesetzt ist.

himitsu 29. Okt 2009 23:35

Re: Bitweise Operatoren von C++ in Delphi übersetzen
 
jupp, also im Prinzip
Delphi-Quellcode:
VAR and CONST = CONST
Fogendes geht nur, wenn CONST nur aus einem Bit besteht
da ist dann ein is_not_zero-TEST meist schneller/kleiner, als ein Integer-CMP
Delphi-Quellcode:
VAR and CONST <> 0
und wenn man übereinstimmende Bitsequenzen hat (1 oder mehrere Bits), dann geht auch sowas
Delphi-Quellcode:
D3DUSAGE_DYNAMIC = $00080;
D3DLOCK_DISCARD = $00800;

//if m_dwUsage and D3DUSAGE_DYNAMIC <> 0 then x := D3DLOCK_DISCARD else x := 0;
x := (m_dwUsage and D3DUSAGE_DYNAMIC) shl 4;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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