2009-08-21 10 views
5

Devo ammettere che in tutto il mio lavoro con Java, non ho mai incontrato la necessità di un unione Java (come il sindacato C, non quello SQL) e non riesco a trovare una risposta qui su SO. A dire il vero, la maggior parte del mio lavoro in Java è stata a livello di astrazioni più alte di quelle che hanno un po 'di manipolazione.Come posso ottenere/impostare singoli bit in un float?

Ho un numero intero per il quale sto impostando i singoli bit e voglio stampare il float IEEE754 a precisione singola equivalente.

In C, mi piacerebbe fare qualcosa di simile:

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

Come faccio a fare una cosa simile in Java? È persino possibile trattare la stessa memoria di due diversi tipi di dati in Java?

Ho cercato sia su SO che altrove per "java union", ma mi ha sommerso di cose SQL - non sono riuscito a trovare un modo per farlo.

risposta

12

Ho un intero che sto impostando singoli bit e voglio stampare l'equivalente IEEE754 float a precisione singola.

Utilizzare intBitsToFloat() per quello.

+0

Bang. Questo è quello che stavo cercando. E vedo il contrario è Float.floatToRawIntBits. Ora ho solo bisogno della variante Double/Long ma presumo, se ce n'è una, sarà nella classe Double. Andrò a trovarlo. Grazie mille. – paxdiablo

+2

Sono ancora confuso ... cosa c'entra questo con i sindacati? – skaffman

+0

E +1. – paxdiablo

9

Substitutes for Missing C Constructs

I progettisti di programmazione del Java linguaggio scelto di omettere il costrutto unione perché c'è un molto meglio meccanismo per la definizione di un singolo tipo di dati grado di rappresentare oggetti di vario tipo: subtyping. Un'unione discriminata è in realtà solo una imitazione pallida di una gerarchia di classi.

Include esempi.

+0

Sì, ma una gerarchia di classi non va bene qui. Voglio essere in grado di impostarlo come un tipo e leggerlo come un altro. Una gerarchia di classi mi costringerà a impostarlo e leggerlo come lo stesso tipo. – paxdiablo

+0

+1 per il link molto bello – dfa

+0

Facciamo il backup: c'è un modo per cambiare un bit in un float? Questo è quello che sto cercando.Voglio essere in grado di impostare (ad esempio) i bit 31, 27, 4 e 0 del galleggiante per vedere quale valore è. – paxdiablo

5

Java non fornisce alcun modo per trattare un valore come un altro valore a livello di bit non elaborato - nessun sindacato, niente come reinterpret_cast. Tuttavia, per il tuo caso particolare di trattamento di float come int e viceversa, è possibile utilizzare i metodi java.lang.Float.floatToIntBits e intBitsToFloat.

+0

+1 per le informazioni, anche se @MB ti ha appena battuto. Grazie. – paxdiablo

4

Se siete interessati ad accedere alla rappresentazione a livello di bit di un galleggiante, java.lang.Double contiene metodo per fare questo (doubleToLongBits etc.)

Union'ing tra tipi di puntatore (o tra i puntatori e la loro rappresentanza numerica) aprirà buchi nel sistema di tipi, quindi è strettamente impossibile.

+1

+1. e questo termina la mia ricerca (ne avrò bisogno per il doppio/lungo più tardi). Ta. – paxdiablo

Problemi correlati