Каков наилучший способ объединить два uints в ulong в c # - PullRequest
9 голосов
/ 31 июля 2009

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

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

Ответы [ 4 ]

19 голосов
/ 31 июля 2009
ulong mixed = (ulong)high << 32 | low;

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

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

uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
2 голосов
/ 31 июля 2009
ulong output = (ulong)highUInt << 32 + lowUInt

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

1 голос
/ 31 июля 2009

Кодировка:

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

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

uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
1 голос
/ 31 июля 2009

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

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