在c#中将一个long解析为两个int变量

本文关键字:变量 int 两个 一个 long | 更新日期: 2023-09-27 18:18:56

我有一系列ulong实例,每个实例包含两个单独的值。前4个字节表示一个uint值,后4个字节表示另一个。将ulong解析为两个uint变量的最有效方法是什么?这将发生在紧密的循环,所以我正在寻找最快的模式。

在c#中将一个long解析为两个int变量

两个选项:

  • 使用unsafe代码或滥用显式布局的struct(作为联合)来无声地将其撕成碎片
  • 使用移位操作

我通常更喜欢后者;例如

uint x = (uint)(value & 0xFFFFFFFF), y = (uint)((value >> 32)&0xFFFFFFFF)

除了可以在更多的环境中工作(不是所有的虚拟机都允许unsafe),这避免了在不同端机器(可能使用Mono)上混淆的风险。

unsafe版本应该是这样的:

uint* ptr = (uint*)(void*)&value;
uint x = ptr[0], y = ptr[1];

哪个更快:try是两个选项和时间t!微优化只能在特定的代码上下文中进行评估。

您还可以显式地布局具有重叠字段的结构体(类似于C联合)。

[StructLayout(LayoutKind.Explicit)]
struct SplitStruct
{
 [FieldOffset(0)]
 public ulong ulongValue;
 [FieldOffset(0)]
 public uint uintValue1;
 [FieldOffset(4)]
 public unit uintValue2;
}

虽然我个人还是会使用位移位。显式布局的结构体隐藏了正在发生的事情,并且相当模糊。