2012-05-17 68 views
5

Làm cách nào để nhận các bit đơn (hoặc toàn bộ biến) của một số double hoặc float?Chuyển đổi phao sang bit

Ví dụ: nếu tôi có float a = 0.5;

Tôi mong chờ một String bằng:
"00111111000000000000000000000000"

hoặc trong hex:
"F000000"

+0

Đây có phải là bài tập về nhà không? – dckrooney

+0

No. Nó liên quan đến http://stackoverflow.com/questions/10637594/calculating-double-neighbours-of-a-decimal-value. Tôi nghĩ rằng nếu tôi trừ 1 từ giá trị nhị phân, tôi sẽ nhận được giá trị khác. –

+3

@dcrooney hỏi vì thật tốt khi biết bài tập về nhà vì khi làm bài tập ở nhà, chúng tôi cố gắng cẩn thận với câu trả lời của mình rằng chúng tôi không ức chế việc học của bạn :) – kentcdodds

Trả lời

9
long bits = Double.doubleToLongBits(myDouble); 
System.out.println(Long.toBinaryString(bits)); 
+1

Nếu bit dấu bằng không, nó sẽ không được in! – math

+0

@math, bạn có thể giải thích không? Bạn có nghĩa là bit dấu sẽ không được in, hoặc toàn bộ giá trị? Nếu trước đây, có, 'Long.toBinaryString' không in các bit không liên quan cho mỗi" Giá trị [unsigned long] này được chuyển đổi thành một chuỗi các chữ số ASCII theo nhị phân (cơ sở 2) mà không có số 0 hàng đầu ", nhưng đây không phải là duy nhất cho bit dấu. Bạn có thể không pad giá trị từ bên trái để có được chiều rộng cột mong muốn của bạn. –

+0

Như tôi đã nói, nó sẽ không được in, do số 0 đứng đầu. Tất nhiên, người ta có thể làm điều này với số không đứng đầu, nhưng tuyên bố trên có thể bị hiểu sai trong đó. Và có, nếu số mũ có số không đứng đầu thì chúng cũng sẽ bị cắt. – math

1

Double.byteValue() thể giúp bạn.

Ngoài ra còn có tương đương 32 bit Float.byteValue().

+4

Tại sao lại là +4? Dựa trên ví dụ của mình, đây không phải là điều anh ta muốn. – user949300

+2

Giá trị byte chỉ trả về giá trị tương đương của '(byte) myDouble'. Đó là một chuyển đổi mất mát. –

+1

** Câu trả lời này sai. ** 'Float.byteValue()' và 'Double.byteValue()' chỉ đơn giản là gán số thành byte. – Pacerier

3

Nhìn vào Float.floatToIntBits() or Float.floatToRawIntBits(). Điều đó giúp bạn có được các bit như một int. Nếu bạn cần nó như một String, Integer.toBinaryString().

Lưu ý, có thể có vấn đề nếu HSB bật - bạn có thể cần phải chuyển đổi thành một khoảng thời gian dài để tránh "tràn".

+0

HSB trong phao IEEE-754 là bit dấu, trừ khi đó là giá trị NaN, do đó, dấu của int kết quả sẽ giống như dấu phẩy, với ngoại lệ là -0.0. –

+0

Đồng ý. Lời nhận xét đó là bởi vì một số mã Java int <-> String là cầu kỳ về HSB. ví dụ. [thảo luận stackoverflow này] (http://stackoverflow.com/questions/8888946/converting-32-bit-binary-string-with-integer-parseint-fails). Mặc dù tôi nghĩ rằng nó chủ yếu để phân tích chuỗi, chứ không phải tạo chúng, do đó vấn đề đó có thể không áp dụng ở đây. – user949300

0
public void printFloatBits(float f) { 
    int bits = Float.floatToIntBits(f); 
    // Extract each bit from 'bits' and compare it by '0' 
    for (int i=31; i>=0; --i) { 
     // int mask = 1 << i; 
     // int oneBit = bits & mask; 
     // oneBit == 0 or 1? 
     System.out.print((bits & (1 << i)) == 0 ? "0" : "1"); 
    } 
} 
+2

vui lòng thêm một số giải thích cho mã của bạn. –

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