Tôi đang phát triển một thư viện lớp di động trong C# và tôi muốn chuyển đổi bit double
thành long
. Giải pháp đơn giản nhất cho vấn đề này là sử dụng phương thức BitConverter.DoubleToInt64Bits
, nhưng tiếc là phương thức này không có sẵn trong tập con thư viện di động của thư viện lớp .NET..NET Thư viện di động thiếu BitConverter.DoubleToInt64Bits, thay thế rất chậm
Là một thay thế tôi đã đưa ra "hai-pass" chuyển đổi bit sau:
var result = BitConverter.ToInt64(BitConverter.GetBytes(x), 0);
xét nghiệm của tôi cho thấy rằng biểu thức này luôn tạo ra kết quả tương tự như DoubleToInt64Bits
. Tuy nhiên, thử nghiệm điểm chuẩn của tôi cũng cho thấy rằng công thức thay thế này xấp xỉ khoảng bốn lần chậm hơn DoubleToInt64Bits
khi được triển khai trong một ứng dụng .NET Framework đầy đủ.
Chỉ sử dụng tập hợp con Thư viện di động, có thể triển khai thay thế DoubleToInt64Bits
nhanh hơn công thức của tôi ở trên không?
Tuyệt vời, những gì một giải pháp thông minh, cảm ơn nhiều Omer! Giải pháp của bạn chậm hơn so với phương thức 'DoubleToInt64Bits' của khung công tác đầy đủ, nhưng nhanh gấp hai lần giải pháp" hai lần "của tôi. Trong một thời gian, tôi hơi lo lắng rằng điều này sẽ không hoạt động trong một thư viện di động, vì không có dấu hiệu nào trên MSDN rằng tập con thư viện di động hỗ trợ [thuộc tính FieldOffset] (http://msdn.microsoft.com/en- us/library/system.runtime.interopservices.fieldoffsetattribute.aspx). Tuy nhiên, việc thực hiện các công trình vì vậy nó chỉ có vẻ là một giám sát trong tài liệu MSDN. –
Một lợi ích bổ sung với giải pháp của bạn là tôi có thể dễ dàng thêm trường 'ulong ULong' vào cấu trúc' Union' và tương tự thực hiện phương thức 'DoubleToUInt64Bits' trả về giá trị' ulong'. Sự linh hoạt này được đánh giá cao :-) –
Vui vì tôi có thể giúp :-) –