2011-09-24 29 views
5

Câu hỏi này có lẽ là "bất thường", nhưng tôi cần phải đúc một phao Number đến một số nguyên Number, mà không sửa đổi biểu diễn nhị phân của nó. Ví dụ: phao 37.5 được biểu thị bằng các byte 0x42160000 (theo IEEE 754). Tôi cần phải diễn giải lại 0x42160000 dưới dạng số nguyên, tức là số 1108738048Reinterpret cast floating point number thành số nguyên

Làm cách nào để thực hiện việc này? Tôi nghĩ rằng có thể có một số thủ thuật bitwise để thực hiện điều này?

Để rõ ràng, tôi là không phải tìm kiếm Math.round hoặc parseInt.

Trả lời

5

Typed arrays có thể hữu ích ở đây: http://jsfiddle.net/rtYrM/.

// create array which is specialized for holding 1 float value 
var floatArray = new Float32Array(1); 

// set the float value 
floatArray[0] = 37.5; 

// use its buffer (4 bytes for 1 float) and pass it to an array 
// specialized for integers 
var intArray = new Int32Array(floatArray.buffer); 

// the integer array will interpret the buffer bytes as an integer, 
// which seems to be just what you want 
intArray[0] === 1108738048; //true 

intArray.buffer sẽ tổ chức các byte giống như floatArray.buffer, nhưng không truy cập vào nó với bộ đệm nhưng với các mảng chính nó, nó sẽ đọc những byte như các loại theo quy định của mảng gõ: là số nguyên cho Int32Array, và làm nổi cho Float32Array.

Trong trường hợp này (cơ số 10):

  • floatArray được thiết lập với giá trị [ 37.5 ].
  • floatArray.buffer được tự động đặt thành giá trị [ 0, 0, 22, 66 ].
  • floatArray.buffer được chuyển đến một mảng số nguyên mới, intArray.
  • intArray.buffer do đó chứa các giá trị [ 0, 0, 22, 66 ].
  • intArray chứa giá trị [ 1108738048 ], được tính bằng bộ đệm của nó.
+0

Tuyệt vời. Điều này có được hỗ trợ bởi tất cả các trình duyệt chính không? Tôi chưa bao giờ nghe nói về Float32Array hoặc Int32Array ... – Bart

+0

@Bart: Tôi thực sự không nghĩ như vậy - đó là thương hiệu mới trong thực tế. Nó hoạt động trên Chrome - hãy để tôi kiểm tra các trình duyệt khác. – pimvdb

+0

@Bart: Hỗ trợ trong Firefox (ít nhất là Firefox 6), Chrome và Safari. Không có trong IE hay trong Opera, tôi sợ ... – pimvdb

0

Tôi không tin Javascript bao gồm bất kỳ cơ chế nào để thực hiện việc này. Có một phương pháp java.lang.Float.floatBitsToIntBits() trong Java, do đó, tùy thuộc vào môi trường dự định của bạn, bạn có thể sử dụng điều đó. Nếu mọi thứ khác không thành công, bạn có thể phải gửi dữ liệu trở lại máy chủ để được chuyển đổi. Ngoài ra, tôi đã thấy cố gắng ở các phương pháp Javascript để thực hiện chuyển đổi này, nhưng chưa bao giờ một phương thức hoàn chỉnh và chính xác 100%.

+0

Vâng, một phương pháp không đầy đủ sẽ tốt hơn là không có gì cả. Bạn có thể chỉ cho tôi một số nỗ lực không? – Bart

+1

Có điều này: http://stackoverflow.com/questions/3077718/converting-a-decimal-value-to-a-32bit-floating-point-hexadecimal/3117567#3117567. Mặc dù tiêu đề chủ đề, anh ấy cho thấy một chuyển đổi theo một hướng khác. –

Các vấn đề liên quan