2012-05-17 6 views
5

Как я могу получить одиночные биты (или всю переменную) double или float?Преобразование float в бит

Например, если у меня есть float a = 0.5;

Я бы ожидать String равна:
"00111111000000000000000000000000"

или в шестнадцатеричном:
"F000000"

+0

Является ли это домашнее задание? – dckrooney

+0

Нет. Почему? Это связано с http://stackoverflow.com/questions/10637594/calculating-double-neighbours-of-a-decimal-value. Я думал, что если я вычитаю 1 из двоичного значения, я бы получил другое значение. –

+3

@dcrooney спросил, потому что хорошо знать, является ли это домашним заданием, потому что, когда это домашнее задание, мы стараемся быть осторожными с нашими ответами, что мы не препятствуем вашему обучению :) – kentcdodds

ответ

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

Если бит знака равен нулю, он не будет напечатан! – math

+0

@math, не могли бы вы объяснить? Вы имеете в виду, что бит знака не будет напечатан, или значение полностью? Если первое, да, 'Long.toBinaryString' не печатает посторонние биты на« Это значение [unsigned long] преобразуется в строку из цифр ASCII в двоичном формате (база 2) без дополнительных начальных 0 », но это не уникальный для знакового бита. Вы можете пропустить нулевое значение слева, чтобы получить нужную ширину столбца. –

+0

Как я уже сказал, он просто не будет напечатан, из-за начального нуля. Конечно, это можно было бы использовать с ведущими нулями, но приведенное выше утверждение могло быть неверно истолковано в этом. И да, если у экспонента есть и начальные нули, они будут обрезаны. – math

1

Double.byteValue() может помочь вам.

Существует также 32-разрядный эквивалент Float.byteValue().

+4

Почему +4? Основываясь на его примере, это не то, что он хочет. – user949300

+2

Байт-значение просто возвращает эквивалент '(byte) myDouble'. Это конверсия с потерями. –

+1

** Этот ответ неверен. ** 'Float.byteValue()' и 'Double.byteValue()' просто переводит число в байт. – Pacerier

3

Посмотрите на Float.floatToIntBits() or Float.floatToRawIntBits(). Это дает вам биты как int. Если вам это нужно как строка, Integer.toBinaryString().

Обратите внимание, что может возникнуть проблема, если HSB включен - вам может потребоваться преобразовать в длинный, чтобы избежать «переполнения».

+0

HSB в поплавке IEEE-754 является битом знака, если это не значение NaN, поэтому знак результирующего int будет таким же, как и для float, за исключением -0.0. –

+0

Согласен. Этот комментарий был вызван тем, что некоторые из Java int <-> Строковый код суетливый о HSB. например [это обсуждение stackoverflow] (http://stackoverflow.com/questions/8888946/converting-32-bit-binary-string-with-integer-parseint-fails). Хотя я думаю, что это в основном для синтаксического анализа строк, а не для их создания, поэтому проблема здесь может не распространяться. – 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

, пожалуйста, добавьте некоторые пояснения к вашему коду. –

Смежные вопросы