2012-05-17 30 views
5

¿Cómo puedo obtener bits individuales (o una variable completa) de double o float?Convertir float en bits

Por ejemplo, si tengo flotante a = 0.5;

me esperaba un String igual a:
"00111111000000000000000000000000"

o en hexadecimal:
"F000000"

+0

Es esta tarea? – dckrooney

+0

No. ¿Por qué? Está relacionado con http://stackoverflow.com/questions/10637594/calculating-double-neighbours-of-a-decimal-value. Pensé que si restaba 1 del valor binario obtendría el otro valor. –

+3

@dcrooney preguntó porque es bueno saber si es tarea porque cuando se trata de tareas tratamos de tener cuidado con nuestras respuestas para no inhibir su aprendizaje :) – kentcdodds

Respuesta

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

Si el bit de signo es cero, ¡no se imprimirá! – math

+0

@math, ¿podría explicarlo? ¿Quiere decir que el bit de signo no se imprimirá o el valor en su totalidad? Si el primero, sí, 'Long.toBinaryString' no imprime bits extraños por" Este valor [unsigned long] se convierte en una cadena de dígitos ASCII en binario (base 2) sin ningún 0 extra líder ", pero esto no es único para el bit de signo. Puede cero rellenar el valor de la izquierda para obtener el ancho de columna deseado. –

+0

Como dije, simplemente no se imprimirá, debido al cero inicial. Por supuesto, uno podría rellenar esto con ceros a la izquierda, pero la afirmación anterior podría malinterpretarse en ese sentido. Y sí, si el exponente también tiene ceros a la izquierda, serán cortados de la misma manera. – math

1

Double.byteValue() podría ayudarle. También hay un equivalente de 32 bits Float.byteValue().

+4

¿Por qué +4? Basado en su ejemplo, esto no es lo que él quiere. – user949300

+2

El valor de bytes simplemente devuelve el equivalente de '(byte) myDouble'. Es una conversión con pérdida. –

+1

** Esta respuesta es incorrecta. ** 'Float.byteValue()' y 'Double.byteValue()' simplemente arroja el número al byte. – Pacerier

3

Mire Float.floatToIntBits() or Float.floatToRawIntBits(). Eso te da los bits como un int. Si lo necesita como una cadena, Integer.toBinaryString().

Tenga en cuenta que puede haber un problema si el HSB está activado; puede que necesite convertirlo a un valor largo para evitar un "desbordamiento".

+0

El HSB en un flotante IEEE-754 es el bit de signo, a menos que sea un valor NaN, por lo que el signo del int resultante será el mismo que el del flotante, con la excepción de -0.0. –

+0

De acuerdo. Ese comentario se debió a que parte del código de cadena Java int <-> es quisquilloso con respecto al HSB. p.ej. [esta discusión de stackoverflow] (http://stackoverflow.com/questions/8888946/converting-32-bit-binary-string-with-integer-parseint-fails). Aunque creo que es principalmente para analizar cadenas, no para crearlas, por lo que ese problema podría no aplicarse aquí. – 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

por favor, agregue alguna explicación a su código. –

Cuestiones relacionadas