¿Cuál es la mejor manera de combinar dos uints en un ulong en c#?
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.
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);