Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schneller Zugriff auf Bits (https://www.delphipraxis.net/38208-schneller-zugriff-auf-bits.html)

Dust Signs 16. Jan 2005 10:27


Schneller Zugriff auf Bits
 
Hi :)!

In C kann man sehr "schön" über "Array"-Klammern [] auf die einzelnen Bits eines Integers zugreifen. Mich würde interessieren, ob es sowas änhliches auch in Delphi gibt...

Dust Signs

SirThornberry 16. Jan 2005 10:47

Re: Schneller Zugriff auf Bits
 
Nein, du musst dir selbst eine funktion schreiben um herauszufinden ob ein bit gesetzt ist (bzw. die suche nutzen, da gibts genug beispiele). In C wird intern vermutlich auch nix anderes gemacht

maynard 19. Jan 2005 23:56

Re: Schneller Zugriff auf Bits
 
mhmm ... Operatoren überladen, feine Sache... leider nicht in Delphi bzw. Delphi Language

Robert_G 20. Jan 2005 00:24

Re: Schneller Zugriff auf Bits
 
mit einem set (also einer Menge/Bitfeld) sollte es gehen:
Delphi-Quellcode:
type TAlleBitsEinenIntegers = set of 0..32;
   PAlleBitsEinesIntegers = ^TAlleBitsEinenIntegers;

var
   AlleBitsEinenIntegers: TAlleBitsEinenIntegers;
   EinInteger, i: Integer;
   Output: String[32];
begin
   EinInteger := 4294967295;
   AlleBitsEinenIntegers := PAlleBitsEinesIntegers(@EinInteger)^;
   FillChar(Output, 32, '0');

   for i := 32 downto 1 do
      if pred(i) in AlleBitsEinenIntegers then
         Output[32 - i] := '1';

   Writeln(Output);
   Sleep(2000);
end.
Ist vielelicht etwas umständlich, aber ich arbiete eigentlich nie mit Pointern oder primitiven Typen. ;)
Output
1111111111111111111111111111111


Edit: Habe aus der vertikalen Darstellung ein Füllen eines String[32] gemacht.

JasonDX 20. Jan 2005 06:39

Re: Schneller Zugriff auf Bits
 
Auf die einzelnen Bits eines Integer würde ich mit Shiften zugreifen
Delphi-Quellcode:
a[i]
//wird dann
(a and (1 shl i))

//Bit Setzen
a := (a or (1 shl i));

//Bit Toggeln
a := (a xor (1 shl i));




Edit: Korrigiert *gg*

Robert Marquardt 20. Jan 2005 07:20

Re: Schneller Zugriff auf Bits
 
Zitat:

Zitat von Dust Signs
In C kann man sehr "schön" über "Array"-Klammern [] auf die einzelnen Bits eines Integers zugreifen.

Das ist mir neu. Das geht hoechstens in C++.
Was man in C machen kann ist ein struct (record) mit Bitfeldern als Elementen.

Oxmyx 20. Jan 2005 11:31

Re: Schneller Zugriff auf Bits
 
In Delphi kann man weder den []-Operator überladen, noch kann man Bitfelder erstellen. Also bleibt dir nur eine Funktion übrig, die das erledigt.

Dust Signs 20. Jan 2005 11:32

Re: Schneller Zugriff auf Bits
 
Zitat:

Zitat von Oxmyx
In Delphi kann man weder den []-Operator überladen, noch kann man Bitfelder erstellen. Also bleibt dir nur eine Funktion übrig, die das erledigt.

Mit Funktion is das aber extrem langsam. Ich denk da an Dinge wie digitale Suche bzw. Digitales Sortieren

Dust Signs

Robert Marquardt 20. Jan 2005 13:38

Re: Schneller Zugriff auf Bits
 
Na dann eben Inlining betreiben.
Delphi-Quellcode:
const
  BitMask: array [0..31] of Cardinal =
   ($00000001, $00000002, $00000004, $00000008,
    // den Rest mach selber
    );

begin
  // Bit testen
  if (Value and BitMask[Index]) <> 0 then
  // Bit Setzen
  Value := Value or BitMask[Index];
  // Bit ruecksetzen
  Value := Value and not BitMask[Index];

negaH 20. Jan 2005 13:44

Re: Schneller Zugriff auf Bits
 
Delphi-Quellcode:
type
  IBitSet = Interface
    ... bla bla
  end;

  TBitSet = class(TInterfacedObject)
  ... bla bla
  public
    property Bit[Index: Integer]: Boolean read GetBit write SetBit; default;
  end;

function BitSet(Value): IBitSet;
begin
  Result := TBitSet.Create(Value);
end;

var
  B: IBitSet;
begin
  B := BitSet(12345);

// Anwendung durch indizierte Property und als Default Property und als Interface mit refCounting und
// autom. Garbage Collection

  if B[2] then B[3] := True;

end;
Es geht also doch :)

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.
Seite 1 von 2  1 2      

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