Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Grafik / Sound / Multimedia (https://www.delphipraxis.net/21-library-grafik-sound-multimedia/)
-   -   Delphi Bitmaske Erstellen (https://www.delphipraxis.net/55685-bitmaske-erstellen.html)

igel457 25. Okt 2005 12:13


Bitmaske Erstellen
 
Eine Bitmaske erstellen oder: Wie kann ich ein "Dezimal-Byte" Binär darstellen?
Manchmal ist es nötig einen Wert binär darzustellen. Besonders wichtig kann dies bei der Ansteuerung Externer Hardware werden.

Und so geht es.

Ersteinmal brauchen wir einen Record "TBitmask" (ist ja klar...):
Delphi-Quellcode:
type
  TBitmask = record
    Bits : array[0..7] of boolean;
end;
Und dann schreiben wir uns eine Funktion mit der wir die Bitmaske erstellen können (auch klar)

Delphi-Quellcode:
function GetBitMask(abyte:byte):TBitmask;
var i:integer;
begin
  for i := 0 to 7 do result.Bits[i] := false; //Das Ergebnis "nullen"
  //Ist der Wert ungerade, dann ist das erste Bit true
  if abyte mod 2 = 1 then result.Bits[0] := true;
  //Wenn unser Byte im Bitmuster mit 2 übereinstimmt, so ist auch dieser Wert true.
  if ((abyte) and integer(2))<>0 then result.Bits[1] := true;
  //Wenn unser Byte im Bitmuster mit 4 übereinstimmt, so ist auch dieser Wert true usw...
  if ((abyte) and integer(4))<>0 then result.Bits[2] := true;
  if ((abyte) and integer(8))<>0 then result.Bits[3] := true;
  if ((abyte) and integer(16))<>0 then result.Bits[4] := true;
  if ((abyte) and integer(32))<>0 then result.Bits[5] := true;
  if ((abyte) and integer(64))<>0 then result.Bits[6] := true;
  if ((abyte) and integer(128))<>0 then result.Bits[7] := true;
end;
So ich hoffe ihr seid jetzt ein wenig aufgeklärter.

Man kann die Funktion auch noch weiter erweitern (Integer), aber das spare ich mir jetzt. Ich hoffe ihr habt das Grundprinzip verstanden. :-).

Wenn man den Code von oben genauer ansieht, könnte man sich doch eigentlich Vorstellen das Ganze in eine Schleife zu packen.

Das geht auch und zwar so (danke an Muetze1):
Delphi-Quellcode:
function GetBitMask(const abyte:byte):TBitmask;
var
  i: integer;
begin
  For i := Low(Result) To High(Result) Do
    Result.Bits[i] := ( AByte And ( 1 Shl i ) ) <> 0;
end;
Oder so (danke an Ken_Jones):
Delphi-Quellcode:
function GetBitMask(abyte:byte):TBitmask;
var i:integer;
begin
  for i := 0 to 7 do result.Bits[i] := (abyte shr i and $1) = $1;
end;
Von der Performance sollten alle drei Methoden ungefähr gleich sein.
2. Aus einer Bitmaske einen Wert errechnen
Im ersten Teil haben wir aus einem Byte-Wert eine Bitmaske erstellt. Was muss man aber tun, wenn man aus dieser Bitmaske wieder einen Wert errechenen will?

Theorethisch:

Möchte man eine Zahl (z.B. 00101100) im Binären System in eine Zahl im Dezimalen System umrechen, geht das normalerweise so:
Delphi-Quellcode:
--> Die 2er Potenzen in einer Reihe 1 2 4 8 16 32 64 128
--> Unsere binäre Zahl             0 0 1 0 1  1  0  0
--> Daraus folgt:                  0 + 4 + 16 + 32 + 64  = 116
In Delphi geht das dann so:

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;
Hoffe es ist verständlich.

Und für alle die nicht wissen was es mit "shl" auf sich hat:
x Shl y verschiebt Bits um eine y-Stellen nach links (darum das shl).
Dies entspricht: x * 2^y. Ganau das was wir brauchen. (Danke an Khabarakh)

[edit=Chakotay1308]Punkt "2" angefügt. Mfg, Chakotay1308[/edit]

ken_jones 25. Okt 2005 12:34

Re: Bitmaske Erstellen
 
Ööh,ja.. Oder so:

Delphi-Quellcode:
function GetBitMask(abyte:byte):TBitmask;
var i:integer;
begin
  for i := 0 to 7 do result.Bits[i] := (abyte shr i and $1) = $1;
end;

Muetze1 25. Okt 2005 12:36

Re: Bitmaske Erstellen
 
Andere Möglichkeit: Bitmaske erstellen mit dem Shift anstatt alles runterzuschieben...
Delphi-Quellcode:
function GetBitMask(const abyte:byte):TBitmask;
var
  i: integer;
begin
  For i := Low(Result) To High(Result) Do
    Result.Bits[i] := ( AByte And ( 1 Shl i ) ) <> 0;
end;


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