Qual è il modo migliore per combinare due uint in un ulong in c#
Domanda
Qual è il modo migliore per combinare due uint in un ulong in c#, impostando gli uint alti/bassi.
So che il bitshifting può farlo, ma non conosco la sintassi, o forse ci sono altre API che aiutano come BitConverter, ma non vedo un metodo che faccia quello che voglio.
Soluzione
ulong mixed = (ulong)high << 32 | low;
Il cast è molto importante.Se ometti il cast, considerando il fatto che high
è di tipo uint
(che è 32 bit), sposterai un valore a 32 bit di 32 bit a sinistra.Gli operatori di spostamento su variabili a 32 bit utilizzeranno il materiale di spostamento right-hand-side
mod 32.Effettivamente, spostando a uint
32 bit a sinistra è una operazione vietata.Casting a ulong
lo impedisce.
Verificare questo fatto è semplice:
uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
Altri suggerimenti
ulong output = (ulong)highUInt << 32 + lowUInt
Gli operatori <<
e >>
spostano i bit rispettivamente a sinistra (in alto) e a destra (in basso). highUInt << 32
è funzionalmente uguale a highUInt * Math.Pow(2, 32)
, ma può essere più veloce ed è (IMO) una sintassi più semplice.
Devi convertire highInt in ulong prima di cambiare bit:
ulong output = highInt;
output = output << 32;
output += lowInt;
Codifica:
ulong mixed = (ulong)hi << 32 | lo;
Decodifica:
uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);