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
((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
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
hallo ihr beiden,
vielen Dank für die Antworten, nun habe ich es verstanden 🙂
Gruß Dennis
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
@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 );
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.
Tja, da habe ich wohl wiedereinmal nicht ganz gelesen 😉
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.