在c#中将两个uint组合成ulong的最佳方法是什么?

时间:2009-07-30 21:17:29

标签: c# bit-shift uint ulong

在c#中将两个uint组合成ulong的最佳方法是什么,设置高/低uints。

我知道bithifting可以做到,但我不知道语法,或者可能有其他API来帮助像BitConverter,但我没有看到一个方法可以做我想要的。

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:2)

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

<<>>运算符分别向左(高)和右(低)位移。 highUInt << 32在功能上与highUInt * Math.Pow(2, 32)相同,但可能更快,并且(IMO)语法更简单。

答案 2 :(得分:1)

在比特移位之前,你必须将highInt转换为ulong:

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

答案 3 :(得分:1)

编码:

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

解码:

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