2009-07-30 18 views

Respuesta

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

El molde es muy importante. Si omite el modelo, considerando el hecho de que high es de tipo uint (que es de 32 bits), estará desplazando un valor de 32 bits de 32 bits hacia la izquierda. Los operadores de cambio en las variables de 32 bits usarán material de cambio por right-hand-side mod 32. Efectivamente, cambiando a uint 32 bits a la izquierda es un no operativo. Casting a ulong evita esto.

Verificación de este hecho es fácil:

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

Solo por curiosidad, ¿por qué es necesario el elenco? – LiraNuna

+0

Si el valor alto es solo un int, entonces el valor << 32 superior será cero, porque acaba de desfasar completamente a todos los de la variable. Necesita que sea un entero de 64 bits * antes de * que comience a cambiarlo. –

+0

Aric: "acabas de sacar a todos completamente de la variable" esto no es completamente cierto. Lee mi respuesta actualizada –

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

El << y >> operadores BitShift a la izquierda (superior) y derecha (inferior), respectivamente. highUInt << 32 es funcionalmente el mismo que highUInt * Math.Pow(2, 32), pero puede ser más rápido y es sintaxis (IMO) más simple.

+0

Está mal. 'highInt << 32 == highInt' si' highInt' es un 'uint'. –

+0

Gracias, agregó el elenco. –

1

Hay que convertir el highInt a un ulong antes BitShift:

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

Codificación:

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

Decodificación:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
Cuestiones relacionadas