Quelle est la meilleure façon de combiner deux nuances en un ulong in c #
Question
Quel est le meilleur moyen de combiner deux informations dans un ulong dans c #, en définissant les informations plus / moins pertinentes.
Je sais que bitshifting peut le faire, mais je ne connais pas la syntaxe, ou il existe peut-être d'autres API comme BitConverter, mais je ne vois pas de méthode qui fasse ce que je veux.
La solution
ulong mixed = (ulong)high << 32 | low;
Le casting est très important. Si vous omettez la conversion, compte tenu du fait que high
est du type uint
(qui est de 32 bits), vous décalerez une valeur de 32 bits de 32 bits vers la gauche. Les opérateurs de décalage sur les variables 32 bits utiliseront le décalage de right-hand-side
mod 32. En effet, décaler de ulong
32 bits vers la gauche est un non-op . La diffusion sur <=> empêche cela.
Il est facile de vérifier ce fait:
uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
Autres conseils
ulong output = (ulong)highUInt << 32 + lowUInt
Les opérateurs <<
et >>
se déplacent respectivement vers la gauche (en haut) et vers la droite (en bas). highUInt << 32
est fonctionnellement identique à highUInt * Math.Pow(2, 32)
, mais peut être plus rapide et sa syntaxe plus simple (IMO).
Vous devez convertir le highInt en ulong avant le décalage de bits:
ulong output = highInt;
output = output << 32;
output += lowInt;
Encodage:
ulong mixed = (ulong)hi << 32 | lo;
Décodage:
uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);