Каков наилучший способ объединить два uints в ulong в c#

каков наилучший способ объединить два uints в ulong в C#, установив высокие / низкие uints.

Я знаю, что bitshifting может это сделать, но я не знаю синтаксиса или, возможно, других API, чтобы помочь, как BitConverter, но я не вижу метода, который делает то, что я хочу.

4 ответов


ulong mixed = (ulong)high << 32 | low;

актерский состав очень важен. Если вы опустите гипс, учитывая тот факт, что high типа uint (что составляет 32 бита), вы будете смещать 32-битное значение 32 бита влево. Операторы сдвига по 32-битным переменным будут использовать shift stuff by right-hand-side mod 32. Эффективно,сдвиг uint 32 бита влево является no-op. Кастинг на ulong препятствует этому.

проверить этот факт легко:

uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1

ulong output = (ulong)highUInt << 32 + lowUInt

на << и >> операторы bitshift влево (выше) и вправо (ниже), соответственно. highUInt << 32 - это функционально то же самое как highUInt * Math.Pow(2, 32), но может быть быстрее и является (IMO) более простым синтаксисом.


вы должны преобразовать highInt в ulong перед bitshift:

ulong output = highInt;
output = output << 32;
output += lowInt;

кодировка:

ulong mixed = (ulong)hi << 32 | lo;

декодирования:

uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);