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 sh
l).
Dies entspricht: x * 2^y. Ganau das was wir brauchen. (Danke an Khabarakh)
[edit=Chakotay1308]Punkt "2" angefügt. Mfg, Chakotay1308[/edit]