Pregunta

¿Cuál es la mejor manera de combinar dos uints en un ulong en c#, configurando los uints altos/bajos?

Sé que el cambio de bits puede hacerlo, pero no conozco la sintaxis, o tal vez haya otras API que ayuden como BitConverter, pero no veo un método que haga lo que quiero.

¿Fue útil?

Solución

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

El reparto es muy importante. Si omite la conversión, teniendo en cuenta el hecho de que high es del tipo uint (que es de 32 bits), desplazará un valor de 32 bits 32 bits a la izquierda. Los operadores de cambio en variables de 32 bits usarán material de cambio en right-hand-side mod 32. Efectivamente, desplazando un ulong 32 bits a la izquierda es un no-op . Enviar a <=> evita esto.

Verificar este hecho es fácil:

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

Otros consejos

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

El << y >> Los operadores desplazan el bit hacia la izquierda (superior) y hacia la derecha (inferior), respectivamente. highUInt << 32 es funcionalmente igual que highUInt * Math.Pow(2, 32), pero puede ser más rápido y tiene (en mi opinión) una sintaxis más simple.

Tienes que convertir el highInt a un ulong antes de cambiar bits:

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

Codificación:

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

Decodificación:

uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top