6

我正在用 C# 开发一个可移植类库,我想将 a 位转换doublelong. 这个问题最直接的解决方案是使用该BitConverter.DoubleToInt64Bits方法,但不幸的是,该方法在 .NET 类库的 Portable Library 子集中不可用。

作为替代方案,我提出了以下“两次”位转换:

var result = BitConverter.ToInt64(BitConverter.GetBytes(x), 0);

我的测试表明,这个表达式始终产生与DoubleToInt64Bits. 但是,我的基准测试也表明,这种替代公式比在完整的 .NET Framework 应用程序中实现时慢大约四倍DoubleToInt64Bits

仅使用便携式库子集,是否可以实现DoubleToInt64Bits比我上面的公式更快的替换?

4

2 回答 2

5

使用工会怎么样?

[StructLayout(LayoutKind.Explicit)]
public struct DoubleLongUnion
{
    [FieldOffset(0)]
    public double Double;

    [FieldOffset(0)]
    public long Long;
}

public static long DoubleToInt64Bits(double value)
{
    var union = new DoubleLongUnion {Double = value};
    return union.Long;
}
于 2012-05-09T15:39:05.727 回答
3

如果您能够标记您的程序集,unsafe那么您可以将DoubleToInt64Bits实现提升到您自己的库中:

public static unsafe long DoubleToInt64Bits(double value)
{
    return *(((long*) &value));
}
于 2012-05-09T14:33:37.927 回答