![]() |
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:
Und dann schreiben wir uns eine Funktion mit der wir die Bitmaske erstellen können (auch klar)
type
TBitmask = record Bits : array[0..7] of boolean; end;
Delphi-Quellcode:
So ich hoffe ihr seid jetzt ein wenig aufgeklärter.
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; 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:
Oder so (danke an Ken_Jones):
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;
Delphi-Quellcode:
Von der Performance sollten alle drei Methoden ungefähr gleich sein.
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; 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:
In Delphi geht das dann so:
--> 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
Delphi-Quellcode:
Hoffe es ist verständlich.
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; 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] |
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; |
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 09:38 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-2025 by Thomas Breitkreuz