2009-08-21 32 views
5

Debo admitir que en todo mi trabajo con Java, nunca he encontrado la necesidad de una unión Java (como la unión C, no la SQL) y no puedo encontrar una respuesta aquí en SO. Es cierto que la mayor parte de mi trabajo en Java ha tenido más abstracciones que el truco de bits.¿Cómo puedo obtener/configurar bits individuales en un flotador?

Tengo un número entero para el que estoy configurando bits individuales y quiero imprimir el flotante de precisión simple IEEE754 equivalente.

En C, que haría algo como:

union { 
    int i; 
    float f; 
} x; 
x.i = 0x27; 
printf ("%f\n", x.f); 

¿Cómo puedo hacer una cosa similar en Java? ¿Es posible tratar la misma memoria como dos tipos de datos diferentes en Java?

Hice una búsqueda en SO SO y en cualquier otro lugar para "unión java", pero me inundó de cosas SQL. No pude encontrar la manera de hacerlo.

Respuesta

12

Tengo un número entero que estoy estableciendo bits individuales para y quiero impresión el flotador de precisión simple IEEE754 equivalente.

Use intBitsToFloat() para eso.

+0

Explosión. Eso es lo que buscaba. Y veo que el reverso es Float.floatToRawIntBits. Ahora solo necesito la variante Doble/Larga pero supongo que, si la hay, estará en la clase Doble. Iré a buscar eso. Montones de gracias. – paxdiablo

+2

Todavía estoy confundido ... ¿qué tiene esto que ver con los sindicatos? – skaffman

+0

Y +1. – paxdiablo

9

Substitutes for Missing C Constructs

Los diseñadores de programación Java lenguaje optaron por omitir la construcción de la unión porque hay una gran mejor mecanismo para definir un único tipo de datos capaz de representar objetos de varios tipos: subtipificación Una unión discriminada es en realidad una imitación pálida de una jerarquía de clases.

Incluye ejemplos.

+0

Sí, pero una jerarquía de clases no es buena aquí. Quiero poder configurarlo como un tipo y leerlo como otro. Una jerarquía de clases me obligará a configurarlo y leerlo como del mismo tipo. – paxdiablo

+0

+1 para un enlace muy bueno – dfa

+0

Retrocedamos - ¿hay alguna manera de cambiar un bit en una carroza? Eso es lo que estoy buscando.Quiero poder establecer (por ejemplo) los bits 31, 27, 4 y 0 del flotador para ver qué valor es eso. – paxdiablo

5

Java no proporciona ninguna forma de tratar un valor como otro valor en el nivel de bit sin procesar, sin uniones, nada como reinterpret_cast. Sin embargo, para su caso particular de tratar float como int y viceversa, puede usar los métodos java.lang.Float.floatToIntBits y intBitsToFloat.

+0

+1 por la información, aunque @MB simplemente te ganó. Gracias. – paxdiablo

4

Si usted está interesado en acceder a la representación a nivel de bit de un flotador, java.lang.Double contiene método para hacer esto (doubleToLongBits etc.)

Union'ing entre tipos de puntero (o entre punteros y su represetantion numérica) abriría agujeros en el sistema de tipos, por lo que es estrictamente imposible.

+1

+1. y esto finaliza mi búsqueda (lo necesitaré por doble/largo tiempo después). Ejército de reserva. – paxdiablo

Cuestiones relacionadas