Laden...

undurchsichtige Umwandlung

Erstellt von dennisspohr vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.202 Views
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 15 Jahren
undurchsichtige Umwandlung

Hallo @ all,

ich muss gerade an dem Programm eines Kollegen weitermachen un bin auf folgende Methode gestoßen:


public static long MakeWord(byte low, byte high)
{
    return ((long)(((byte)(low)) | (((long)(byte)(high)) << 8)));
}

Leider kann ich rein gar nichts damit anfangen.. könnt ihr mir weiterhelfen?

Danke!

Gruß Dennis

B
196 Beiträge seit 2007
vor 15 Jahren
((long)(((byte)(low)) | (((long)(byte)(high)) << 8)));  

entspricht

(low) | ((high) << 8)

was man als binäre Verknüpfung bezeichnen kann

nehmen wir zum beispiel mal
low = 2 = 00000010
high = 1 = 00000001
low | high <<8 (also an achter stelle wird es angefügt)
-> 0000000100000010 =258

your fragile folded wings
are just tired from the pure blue sky
you dont have to force your smiles for anyone
its okay to smile...for yourself

1.378 Beiträge seit 2006
vor 15 Jahren

Der Code ist nur extrem unübersichtlich durch die Casts und Klammern die alle nicht notwendig sind(soweit ich das sehe)

Die Zeile tut das selbe:


return (long)(low | (high << 8));

und zwar ist das folgendes:

Die Bits von high werden um 8 bits nach links verschoben und die bits von low am anfang mit dem oder | operator "eingefügt".

Lg XXX

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 15 Jahren

hallo ihr beiden,

vielen Dank für die Antworten, nun habe ich es verstanden 🙂

Gruß Dennis

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo dennisspohr,

in dem Fall war der Methodenname doch so sprechen, dass man auch ohne den Code verstehen konnte, was sie macht. 🙂 Allerdings wird die Methode durch BitConverter.ToInt16 quasi überflüssig.

herbivore

F
10.010 Beiträge seit 2004
vor 15 Jahren

@xxxprod:

Oh doch, die klammern und Casts sind schon sinnvoll.
Dadurch wird vom low und vom High jeweils nur die untersten 8Bit benutzt.

Man könnte das dann auch so schreiben:


retval = (lowByte & 0xFF )| ( (highByte & 0xFF) << 8 );

1.378 Beiträge seit 2006
vor 15 Jahren

Die übergebenen Typen sind doch bereits Byte und daher 8bit lang und die Operationen << und | giben jeweils einen Int32 Typ zurück. Ich sehe also nicht den Grund für die Casts.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Tja, da habe ich wohl wiedereinmal nicht ganz gelesen 😉

T
5 Beiträge seit 2008
vor 15 Jahren
  
public static long MakeWord(byte low, byte high)  
{  
    return ((long)(((byte)(low)) | (((long)(byte)(high)) << 8)));  
}  
  

Sieht ein bisschen aus wie das Präprozessormakro MAKEWORD aus der Windows-API. Ein Word soll hier vermutlich eine vorzeichenlose 16-Bit-Zahl darstellen, dafür ist ushort oder uint besser geeignet als long. Du solltest prinzipiell ohne einen einzigen Cast auskommen.