在c#中将一个long解析为两个int变量
本文关键字:变量 int 两个 一个 long | 更新日期: 2023-09-27 18:18:56
我有一系列ulong
实例,每个实例包含两个单独的值。前4个字节表示一个uint
值,后4个字节表示另一个。将ulong
解析为两个uint
变量的最有效方法是什么?这将发生在紧密的循环,所以我正在寻找最快的模式。
两个选项:
- 使用
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;
}
虽然我个人还是会使用位移位。显式布局的结构体隐藏了正在发生的事情,并且相当模糊。