6

私はC#でポータブルクラスライブラリを開発していて、ビットをに変換したいと思ってdoublelongます。この問題の最も簡単な解決策はBitConverter.DoubleToInt64Bitsメソッドを使用することですが、残念ながら、このメソッドは.NETクラスライブラリのポータブルライブラリサブセットでは使用できません。

別の方法として、次の「2パス」ビット変換を考え出しました。

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

私のテストでは、この式が一貫してと同じ結果を生成することが示されていDoubleToInt64Bitsます。ただし、私のベンチマークテストでは、この代替の定式化は、完全な.NETFrameworkアプリケーションに実装した場合よりも約4倍遅いことも示されています。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 に答える