AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmaske Erstellen

Ein Thema von igel457 · begonnen am 25. Okt 2005 · letzter Beitrag vom 25. Okt 2005
Antwort Antwort
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
ken_jones

Registriert seit: 16. Mai 2005
Ort: Luzern
154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: Bitmaske Erstellen

  Alt 25. Okt 2005, 13:34
Öö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;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Bitmaske Erstellen

  Alt 25. Okt 2005, 13:36
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;
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 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