AGB  ·  Datenschutz  ·  Impressum  







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

Datenbits effektiv zählen

Ein Thema von shmia · begonnen am 14. Jan 2005
Antwort Antwort
shmia

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

Datenbits effektiv zählen

  Alt 14. Jan 2005, 13: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
Antwort Antwort

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 05:50 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