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

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

有帮助吗?

解决方案

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

演员非常重要。如果省略强制转换,考虑到high类型为uint(32位)的事实,您将向32位左移32位值。 32位变量上的移位运算符将使用right-hand-side mod 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