Estoy desarrollando una biblioteca de clases portátil en C# y quiero convertir un double
a long
bit. La solución más directa a este problema sería utilizar el método BitConverter.DoubleToInt64Bits
, pero lamentablemente este método no está disponible en el subconjunto Biblioteca portátil de la biblioteca de clases .NET..NET biblioteca portátil que falta BitConverter.DoubleToInt64Bits, reemplazo muy lento
Como alternativa He llegado con la siguiente conversión bit "de dos pasadas":
var result = BitConverter.ToInt64(BitConverter.GetBytes(x), 0);
Mis pruebas muestran que esta expresión consistentemente produce el mismo resultado que DoubleToInt64Bits
. Sin embargo, mis pruebas comparativas también muestran que esta formulación alternativa es aproximadamente cuatro veces más lenta que DoubleToInt64Bits
cuando se implementa en una aplicación .NET Framework completa.
Utilizando solo el subconjunto Biblioteca portátil, ¿es posible implementar un reemplazo de DoubleToInt64Bits
que sea más rápido que mi formulación anterior?
Genial, qué solución tan inteligente, muchas gracias Omer! Su solución es más lenta que el método de marco completo 'DoubleToInt64Bits', pero más del doble de rápido que mi solución de" dos pasos ". Durante un tiempo me preocupó un poco que esto no funcionara en una biblioteca portátil, ya que no hay ninguna indicación en MSDN de que el subconjunto de la Biblioteca portátil sea compatible con el atributo [FieldOffset] (http://msdn.microsoft.com/en- us/library/system.runtime.interopservices.fieldoffsetattribute.aspx). Sin embargo, la implementación funciona, por lo que solo parece ser un descuido en la documentación de MSDN. –
Un beneficio adicional con su solución es que puedo agregar fácilmente un campo 'ulong ULong' a la estructura' Union', e implementar análogamente un método 'DoubleToUInt64Bits' que devuelve un valor' ulong'. Esta flexibilidad es muy apreciada :-) –
Me alegro de haber podido ayudar :-) –