Sto sviluppando una libreria di classi portatile in C# e voglio convertire in bit un double
in un long
. La soluzione più semplice a questo problema sarebbe utilizzare il metodo BitConverter.DoubleToInt64Bits
, ma sfortunatamente questo metodo non è disponibile nel sottoinsieme Libreria portatile della libreria di classi .NET.Libreria portatile .NET mancante BitConverter.DoubleToInt64Bits, sostituzione molto lenta
Come alternativa ho fornito con la seguente conversione bit "two-pass":
var result = BitConverter.ToInt64(BitConverter.GetBytes(x), 0);
miei esperimenti indicano che questa espressione produce costantemente lo stesso risultato DoubleToInt64Bits
. Tuttavia, i miei test di benchmark mostrano anche che questa formulazione alternativa è circa quattro quattro volte più lenta di DoubleToInt64Bits
se implementata in un'applicazione .NET Framework completa.
Utilizzando solo il sottoinsieme di Portable Library, è possibile implementare una sostituzione di DoubleToInt64Bits
che sia più veloce della mia formulazione sopra?
Grande, che soluzione intelligente, molte grazie Omer! La tua soluzione è più lenta del metodo completo 'DoubleToInt64Bits', ma più del doppio della mia soluzione" two-pass ". Per un po 'ero un po' preoccupato che ciò non funzionasse in una libreria portatile, dal momento che non c'è alcuna indicazione su MSDN che il sottoinsieme Libreria portatile supporti [l'attributo FieldOffset] (http://msdn.microsoft.com/ us/library/system.runtime.interopservices.fieldoffsetattribute.aspx). Tuttavia, l'implementazione funziona in modo che solo sembra essere una svista nella documentazione MSDN. –
Un ulteriore vantaggio della soluzione è che posso facilmente aggiungere un campo 'ulong ULong' alla struttura' Union', e analogamente implementare un metodo 'DoubleToUInt64Bits' restituendo un valore' ulong'. Questa flessibilità è molto apprezzata :-) –
Contento di aver potuto aiutare :-) –