Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 32bit dword / wie finde ich raus ob bit 0,1 oder 2 gesetzt ? (https://www.delphipraxis.net/11620-32bit-dword-wie-finde-ich-raus-ob-bit-0-1-oder-2-gesetzt.html)

unitedlb 10. Nov 2003 18:43


32bit dword / wie finde ich raus ob bit 0,1 oder 2 gesetzt ?
 
mal wieder eine blöde frage,
aber finde ich raus ob beim dword rückgabewert einer
funktion bit 0,1 oder 2 gesetzt ist?

die funktion stammt aus einer c++-dll...

vielen dank.

Daniel 10. Nov 2003 18:47

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Dieses Forum ist mit einer großartigen Suchfunktion ausgestattet. Mit den beiden folgenden Suchanfragen wärest Du auch von selber darauf gekommen.
bit bytebit byte Hier im Forum suchenbit setzen

:roll:

himitsu 10. Nov 2003 18:47

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Delphi-Quellcode:
Var Bit: Boolean;

Bit0 := (irrgendwas and $01) <> 0; {1. Bit / niedrigstes Bit}
Bit1 := (irrgendwas and $02) <> 0; {2. Bit}
Bit2 := (irrgendwas and $04) <> 0; {3. Bit}
Bit3 := (irrgendwas and $08) <> 0; {4. Bit}
Bit4 := (irrgendwas and $10) <> 0; {5. Bit}
Bit15 := (irrgendwas and $80) <> 0; {16. Bit}
Bit30 := (irrgendwas and $4000) <> 0; {31. Bit}
Bit31 := (irrgendwas and $4000) <> 0; {32. Bit / höchstes Bit}

Chewie 10. Nov 2003 18:49

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Du verknüpfst den DWord-Wert mit einer Zahl, die ausschließlich genau das Bit gesetzt hat, das du herausfinden willst und prüfst auf Gleichheit mit ebendieser Zahl.
Beispiel:

Delphi-Quellcode:
const
  MyValue = 1  //heißt das erste Bit ist gesetzt


if DWordValue and MyValue = MyValue then //...

unitedlb 10. Nov 2003 19:02

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Dieses Forum ist nicht nur mit einer großartigen Suchfunktion ausgestattet,
sondern auch mit großartigen Usern die schnell helfen :zwinker:

vielen dank.

himitsu 10. Nov 2003 19:04

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Chewie's stimmt in etwa mit meinem überein:

aus Sakura's Tut:
Delphi-Quellcode:
(1 shl 0) = $01 {1. Bit}
(1 shl 1) = $02 {2. Bit}
(1 shl 2) = $04 {3. Bit}
...
(1 shl 4) = $20 {5. Bit}
...
Delphi-Quellcode:
Bit1 := (irrgendwas and $02) <> 0;
{oder}
If (irrgendwas and $02) <> 0 Then ...
Delphi-Quellcode:
Bitnummer := 4; {5. Bit / Bit 0 bis 31} 

Bit := (irrgendwas and ($01 shl Bitnummer)) <> 0;
{oder}
If (irrgendwas and ($01 shl Bitnummer)) <> 0 Then ...

Chewie 10. Nov 2003 19:41

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Möglicherweise könnte die Prüfung auf <> 0 ein paar Takte schneller sein; auf jeden Fall liefert sie das gleiche Ergebnis.

Die Variante mit der expliziten Prüfung auf den Wert erhöht IMHO aber die Lesbarkeit.

Christian Seehase 10. Nov 2003 20:55

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Moin Zusammen,

und ich würde mir für die zu prüfenden Bits Konstanten anlegen, die etwas darüber aussagen, was das jeweilige Bit zu bedeuten hat.

negaH 11. Nov 2003 00:36

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Warum Konstanten ??

1.) @himitsu, Bits werden mit Null basiertem Index durchnumeriert, d.h. Bit 0,1,2,3,4
2.)

Delphi-Quellcode:
 
  if Value and (1 shl Bitnummer) <> 0 then ;
Bitnummer kann nun 0 bis 31 sein und auch direkt im Code stehen

Delphi-Quellcode:
  if Value and (1 shl 3) <> 0 then ;
ist das gleiche wie

Delphi-Quellcode:
 if Value and $08 <> 0 then ;
und der Compiler macht aus dem (1 shl 3) intern eh eine Konstante = $08.
Somit muß man keinerlei zusätzliche Konstanten mehr definieren, wenn ma

1.) die Bits von 0 bis 31 durchnummeriert, wie es Standard ist
2.) mit shl arbeitet und einer Konstanten für den Bitindex.

Gruß Hagen

himitsu 11. Nov 2003 09:20

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
@negaH,

hab ich doch :gruebel:

1. Bit = Bit 0
2. Bit = Bit 1
...

negaH 11. Nov 2003 09:38

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Eben nicht:

0. Bit = Bit 0
1. Bit = Bit 1
2. Bit = Bit 2

Damit
Code:
                                     3210 
0. Bit = 1 shl 0 = 1 = 1 shl Bit 0 = 0001 = 2^0
1. Bit = 1 shl 1 = 2 = 1 shl Bit 1 = 0010 = 2^1
2. Bit = 1 shl 2 = 4 = 1 shl Bit 2 = 0100 = 2^2
3. Bit = 1 shl 3 = 8 = 1 shl Bit 3 = 1000 = 2^3
Es geht also darum das der Bit Index von 0 bis 31 geht damit der Shift = Bitnummer wird.

Du, bzw. Sakuras Tut sagt aber.

1. Bit = Bit 0
2. Bit = Bit 1
3. Bit = Bit 2

dies widerspricht sich, man könnte meinen das ich da ein Krümelkacker bin :-)
Allerdings zeigt obige Tabelle sehr schön wie einfach sich alles merken lässt wenn man immer mit 0 basiertem Bitindex arbeitet, und mathematisch gesehen gibt es nur eine korrekte Bitnummerierung die von 0 bis 31 geht. Bei deiner Zählung wäre das

Code:
                                     3210 
1. Bit = 1 shl 0 = 1 = 1 shl Bit 0 = 0001 = 2^0
2. Bit = 1 shl 1 = 2 = 1 shl Bit 1 = 0010 = 2^1
3. Bit = 1 shl 2 = 4 = 1 shl Bit 2 = 0100 = 2^2
4. Bit = 1 shl 3 = 8 = 1 shl Bit 3 = 1000 = 2^3
??? :)


Gruß Hagen

Christian Seehase 11. Nov 2003 20:28

Re: 32bit dword / wie finde ich raus ob bit 0,1 oder 2 geset
 
Moin Hagen,

Zitat:

Zitat von negaH
Warum Konstanten ??

Zitat:

Zitat von Christian Seehase
Konstanten ..., die etwas darüber aussagen, was das jeweilige Bit zu bedeuten hat.

z.B. finde ich das hier übersichtlicher
(ausgedachtes Beispiel)

Delphi-Quellcode:
const
  _IsValidIndex = $4000;

begin
  if (dwFlags and _IsValidIndex) <> 0 then ...
end;
als das

Delphi-Quellcode:
if (dwFlags and $4000) <> 0 then ...
Darum Konstanten ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz