2009-07-30 3 views
8

zu kombinieren Was ist der beste Weg, zwei uints zu einem ulong in C# zu kombinieren und die high/low uints zu setzen.Was ist der beste Weg, zwei uints zu einem ulong in C#

Ich weiß, Bitshifting kann es tun, aber ich weiß nicht die Syntax, oder vielleicht andere APIs wie BitConverter helfen, aber ich sehe keine Methode, die das tut, was ich will.

Antwort

18
ulong mixed = (ulong)high << 32 | low; 

Die Besetzung ist sehr wichtig. Wenn Sie den Cast weglassen und die Tatsache in Betracht ziehen, dass high vom Typ uint ist (also 32 Bit), verschieben Sie einen 32-Bit-Wert 32 Bit nach links. Shift-Operatoren auf 32-Bit-Variablen verwenden Shift-Sachen von right-hand-side mod 32. Effektiv shifting a uint 32 Bits nach links ist ein No-Op. Casting zu ulong verhindert dies.

diese Tatsache Überprüfung ist einfach:

uint test = 1u; 
Console.WriteLine(test << 32); // prints 1 
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1 
+0

Nur aus Neugier, warum wird die Besetzung benötigt? – LiraNuna

+0

Wenn high nur ein int ist, dann ist high << 32 nur Nullen, weil Sie alle Variablen einfach komplett aus der Variablen verschoben haben. Sie benötigen eine 64-Bit-Ganzzahl *, bevor Sie mit der Verschiebung beginnen. –

+0

Aric: "Sie haben gerade alle aus der Variablen verschoben" das ist nicht ganz richtig. Lies meine aktualisierte Antwort. –

2
ulong output = (ulong)highUInt << 32 + lowUInt 

Die << und >> Operatoren bitshift nach links (höher) und der rechten (unteren) verbunden sind. highUInt << 32 ist funktionell das gleiche wie highUInt * Math.Pow(2, 32), kann aber schneller sein und ist (IMO) einfachere Syntax.

+0

Es ist falsch. 'highInt << 32 == highInt' wenn' highInt' ein 'uint' ist. –

+0

Danke, fügte die Besetzung hinzu. –

1

Sie haben die HIGHINT auf ein ulong zu konvertieren, bevor Sie Bitshift:

ulong output = highInt; 
output = output << 32; 
output += lowInt; 
1

Encoding:

ulong mixed = (ulong)hi << 32 | lo; 

Decodierung:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
Verwandte Themen