![]() |
Datenbits effektiv zählen
Hi,
mit der folgende Funktion kann man die Anzahl der gesetzten Datenbits in einem Speicherbereich zählen. Das Besondere daran ist, dass mit Hilfe einer Lookup Tabelle immer gleich 4 Bits auf einmal gezählt werden. Deshalb ist die Funktion sehr schnell. Eine Lookup Tabelle mit 256 Einträgen wäre noch schneller, aber das lohnt den Aufwand nicht.
Delphi-Quellcode:
diese Funktion findet sich auch in der Unit JclLogic aus der JCL, denn ich habe sie bei JCL eingereicht.
function CountBitsSet(P: Pointer; Count: Cardinal): Cardinal;
const lu : packed array[0..15] of Byte = (0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4); var b: Byte; begin Result := 0; while Count > 0 do begin b := PByte(P)^; // lower Nibble Inc(Result, lu[b and $0F]); // upper Nibble Inc(Result, lu[b shr 4]); Dec(Count); Inc(PByte(P)); end; end; Man kann sich nun auch noch für die üblichen Datentypen ein überladene Funktion bauen:
Delphi-Quellcode:
Um die Anzahl der gelöschten Bits zu zählen:
function CountBitsSet(X: Integer): Integer;
begin Result := CountBitsSet(@X, sizeof(X)); end;
Delphi-Quellcode:
function CountBitsCleared(P: Pointer; Count: Cardinal): Cardinal;
begin result := Count*8-CountBitsSet(P: Pointer; Count: Cardinal); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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