![]() |
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 |
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
|
Re: Schneller Zugriff auf Bits
mhmm ... Operatoren überladen, feine Sache... leider nicht in Delphi bzw. Delphi Language
|
Re: Schneller Zugriff auf Bits
mit einem set (also einer Menge/Bitfeld) sollte es gehen:
Delphi-Quellcode:
Ist vielelicht etwas umständlich, aber ich arbiete eigentlich nie mit Pointern oder primitiven Typen. ;)
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. Output 1111111111111111111111111111111 Edit: Habe aus der vertikalen Darstellung ein Füllen eines String[32] gemacht. |
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* |
Re: Schneller Zugriff auf Bits
Zitat:
Was man in C machen kann ist ein struct (record) mit Bitfeldern als Elementen. |
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.
|
Re: Schneller Zugriff auf Bits
Zitat:
Dust Signs |
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]; |
Re: Schneller Zugriff auf Bits
Delphi-Quellcode:
Es geht also doch :)
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; Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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