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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top