Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 8 Integervariablen zu einem Byte (https://www.delphipraxis.net/161945-8-integervariablen-zu-einem-byte.html)

Muellermilchtrinker 28. Jul 2011 17:10

Delphi-Version: 2009

8 Integervariablen zu einem Byte
 
Hallo,

bitte nicht hauen, aber ich weiß, dass das ein wenig suboptimal ist, mit den aktuellen Variablentypen.

Also ich habe 8 Integervariablen, in denen entweder eine 1 oder 0 drin steht. Nun möchte ich diese zu einem Byte zusammenfügen, also als Bytemuster (Bsp: 0b11001100) und diese in einer Bytevariablen speichern, damit ich diese nachher über RS232 verschicken kann? Gibt es da vorgefertige Funktionen oder soll ich mir einfach eine Funktion schreiben, wo ich meine Variablen eingeb und diese dann mit 2^0,2^1,2^2, etc. multipliziert werden und dann addiert, damit ich mein umgerechneten Bytewert hab und diese dann in die Bytevariable zuweisen?

DeddyH 28. Jul 2011 17:15

AW: 8 Integervariablen zu einem Byte
 
Etwas Vorgefertigtes kenne ich dafür nicht, aber so eine Funktion ist ja recht schnell selbst geschrieben. Besser wäre es aber wohl, wenn Du das Konzept noch einmal überdenken würdest ;)

jaenicke 28. Jul 2011 17:20

AW: 8 Integervariablen zu einem Byte
 
Delphi-Quellcode:
var
  var1, var2, var3, var4, var5, var6, var7, var8: Integer;
  ResultVar: Byte;
begin
  var1 := 0;
  var2 := 1;
  var3 := 0;
  var4 := 0;
  var5 := 0;
  var6 := 1;
  var7 := 1;
  var8 := 1;
  ResultVar := (var1 shl 7) or (var2 shl 6) or (var3 shl 5) or (var4 shl 4)
    or (var5 shl 3) or (var6 shl 2) or (var7 shl 1) or var8; // sollte 71 ergeben

p80286 28. Jul 2011 17:33

AW: 8 Integervariablen zu einem Byte
 
Lieber so:
Delphi-Quellcode:
var
  var1, var2, var3, var4, var5, var6, var7, var8: Integer;
  ResultVar: Byte;
begin
  var1 := 0;
  var2 := 1;
  var3 := 0;
  var4 := 0;
  var5 := 0;
  var6 := 1;
  var7 := 1;
  var8 := 1;
  ResultVar := ((var1 and 1) shl 7) or ((var2 and 1) shl 6) or ((var3 and 1) shl 5) or ((var4 and 1) shl 4)
    or ((var5 and 1) shl 3) or ((var6 and 1) shl 2) or ((var7 and 1) shl 1) or (var8 and 1); // sollte 71 ergeben
Gruß
K-H

DeddyH 28. Jul 2011 17:42

AW: 8 Integervariablen zu einem Byte
 
Oder gleich als Funktion?
Delphi-Quellcode:
uses math;

function IntArrayToByte(IntArray: array of integer): Byte;
var
  i: integer;
begin
  Result := 0;
  for i := Low(IntArray) to math.Min(High(IntArray), 7) do
    Result := Result or (IntArray[i] and 1) shl i;
end;

himitsu 28. Jul 2011 17:48

AW: 8 Integervariablen zu einem Byte
 
Warum eigentlich 8 Einzelvariablen?

Delphi-Quellcode:
type
  TMeinByte = Set of 0..7;

  // oder

  TNewByte = record
  private
    function GetBit(idx: Integer):      Boolean;
    procedure SetBit(idx: Integer; Value: Boolean);
  public
    Data: Byte; //Data: TMeinByte;
    property Bit[idx: Integer]: Boolean read GetBit write SetBit; default;
  end;

function TNewByte.GetBit(idx: Integer): Boolean;
begin
  Result := Data and (1 shl idx) <> 0; //Result := idx in Data;
end;

procedure TNewByte.SetBit(idx: Integer; Value: Boolean);
begin
  if Value then
    Data := Data or (1 shl idx) //Include(Data, idx)
  else
    Data := Data and not (1 shl idx); //Exclude(Data, idx);
end;
den Record könnte man noch mit Operatoren ausrüsten, welchen ihn automatisch in und von Byte umkonvertieren.


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