Thema: Delphi Bitmaske Erstellen

Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Bitmaske Erstellen

  Alt 25. Okt 2005, 13:13
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]
Andreas
  Mit Zitat antworten Zitat