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

StackOverflow https://stackoverflow.com/questions/1209439

  •  06-07-2019
  •  | 
  •  

Вопрос

Каков наилучший способ объединить два значения uints в ulong в c #, установив значения high / low.

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

Это было полезно?

Решение

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

Актерский состав очень важен. Если вы опустите приведение, учитывая тот факт, что high имеет тип uint (32-битный), вы сместите 32-битное значение на 32 бита влево. Операторы сдвига для 32-битных переменных будут использовать сдвиги с помощью right-hand-side мода 32. По сути, сдвиг ulong 32 бит влево - это запретная операция . Приведение к <=> предотвращает это.

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

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

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

Вы должны преобразовать highInt в ulong перед битовым сдвигом:

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top