9

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

我知道位移可以做到这一点,但我不知道语法,或者可能有其他 API 可以提供帮助,例如 BitConverter,但我没有看到可以满足我要求的方法。

4

4 回答 4

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

演员阵容非常重要。如果省略强制转换,考虑到hightype的事实uint(即 32 位),您会将 32 位值向左移动 32 位。32 位变量上的移位运算符将使用right-hand-sidemod 32 的移位内容。实际上,uint32 位向左移动是无操作的。铸造以ulong防止这种情况。

验证这一事实很容易:

uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1
于 2009-07-30T21:21:32.060 回答
2
ulong output = (ulong)highUInt << 32 + lowUInt

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

于 2009-07-30T21:20:36.180 回答
1

在位移之前,您必须将 highInt 转换为 ulong:

ulong output = highInt;
output = output << 32;
output += lowInt;
于 2009-07-30T21:22:25.867 回答
1

编码:

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

解码:

uint lo = (uint)(mixed & uint.MaxValue);
uint hi = (uint)(mixed >> 32);
于 2009-07-30T21:46:54.617 回答