Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   BitmaskToByte -> ByteToBitmask (https://www.delphipraxis.net/113326-bitmasktobyte-bytetobitmask.html)

heri 6. Mai 2008 07:50


BitmaskToByte -> ByteToBitmask
 
ich habe in der DP folgenden Code gefunden um eine Bitmask als Byte darzustellen zB. 11000001 -> 1+2+128 -> 131

Delphi-Quellcode:
function BitmaskToByte(AValue:TBitmask):byte;
var i:integer;
begin
  result := 0; // Rückgabewert auf 0 setzten. WICHTIG. Weglassen dieser Zeile kann zu faulen Ergebnisen führen.
  for i := 0 to 7 do
   if avalue.bits[i] then //Wenn dieser Wert der Bitmaske auf "1" steht, muss das Ergebnis um
     Inc(Result, 1 shl i); //2 hoch der Position in der Bitmaske incrementiert werden.
end;
siehe DP: http://www.delphipraxis.net/internal...=bitmasktobyte

nun möchte ich die "Umkehrfunktion" haben und habe dazu folgenden Code erstellt:

Delphi-Quellcode:
function ByteToBitmask(AValue:Byte):TBitmask;
var
i,t:integer;
begin

  t := 1;
  for i := 0 to 7 do
    Inc( t, 1 SHL i );

  for i := 8 downto 0 do
  begin

    if AValue>=t then
    begin

      Result.Bits[i] := True;

      AValue := AValue - t;

    end
    else
      Result.Bits[i] := False;

    t := t div 2;
  end;

end;
kann jemand den aufgeführten Code optimieren oder hat eine bessere Vorgehensweise?
das wäre super!
Thx

DP-Maintenance 6. Mai 2008 07:54

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Falsche Sparte.

SirThornberry 6. Mai 2008 08:06

Re: BitmaskToByte -> ByteToBitmask
 
in die erste Richtung würde ich es so machen:
Delphi-Quellcode:
function BitmaskToByte(AValue:TBitmask):byte;
var i:integer;
begin
  result := 0; // Rückgabewert auf 0 setzten. WICHTIG. Weglassen dieser Zeile kann zu faulen Ergebnisen führen.
  for i := 0 to 7 do
    if avalue.bits[i] then //Wenn dieser Wert der Bitmaske auf "1" steht, muss das Ergebnis um
      result := result or (1 shl i); //2 hoch der Position in der Bitmaske incrementiert werden.
end;
in die andere Richtung wäre es dann so:

Delphi-Quellcode:
function ByteToBitmask(AValue:Byte):TBitmask;
var i: Integer;
begin
  for i := 0 to 7 do
    result.bits[i] := AValue and (1 shl i) <> 0;
end;

nicodex 6. Mai 2008 09:04

Re: BitmaskToByte -> ByteToBitmask
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für die Abbildung von Bits in Delphi finde ich Sets sehr hilfreich.
Damit kann man sich dann die Erstellung (und Konvertierung) von Hilfstypen/-klassen sparen.

Im Anhang findet sich eine Beispiel-Unit (NcxTypes.pas), die verschiedene "Bitfield"-Typen definiert (TBitsX/TSetX).

heri 6. Mai 2008 09:32

Re: BitmaskToByte -> ByteToBitmask
 
super :thumb:

:duck:
(da programmiert man schon seit x-jahren und denkt man kann's -
aber andere (jüngere) können's einfach noch besser -
tja, ihr habt's einfach drauf!!!)

Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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