在c#中将两个uint组合成ulong的最佳方法是什么,设置高/低uints。
我知道bithifting可以做到,但我不知道语法,或者可能有其他API来帮助像BitConverter,但我没有看到一个方法可以做我想要的。
答案 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);