Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

Datenbits effektiv zählen

  Alt 14. Jan 2005, 12:38
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:
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;
diese Funktion findet sich auch in der Unit JclLogic aus der JCL, denn ich habe sie bei JCL eingereicht.
Man kann sich nun auch noch für die üblichen Datentypen ein überladene Funktion bauen:
Delphi-Quellcode:
function CountBitsSet(X: Integer): Integer;
begin
  Result := CountBitsSet(@X, sizeof(X));
end;
Um die Anzahl der gelöschten Bits zu zählen:
Delphi-Quellcode:
function CountBitsCleared(P: Pointer; Count: Cardinal): Cardinal;
begin
  result := Count*8-CountBitsSet(P: Pointer; Count: Cardinal);
end;
Andreas
  Mit Zitat antworten Zitat