Каков наилучший способ объединить два 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);