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.

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top