2009-08-21 12 views
5

Muszę przyznać, że w całej mojej pracy z Javą, nigdy nie spotkałem się z koniecznością unii Javy (jak związek C, a nie SQL) i nie mogę znaleźć odpowiedzi tutaj na SO. Prawdą jest, że większość mojej pracy w Javie była na wyższych poziomach abstrakcji niż błahostka.Jak mogę uzyskać/ustawić poszczególne bity w float?

Mam liczbę całkowitą, dla której ustawiam pojedyncze bity, i chcę wydrukować równoważny płynności IEEE754.

W C, zrobiłbym coś takiego:

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

Jak zrobić coś podobnego w Java? Czy możliwe jest nawet traktowanie tej samej pamięci, co dwa różne typy danych w Javie?

Poszukiwałem zarówno w SO jak i gdzie indziej dla "unii java", ale zapełniło mnie to materiałem SQL - nie mogłem znaleźć sposobu na zrobienie tego.

Odpowiedz

12

Mam całkowitą który mam ustawienie poszczególnych bitów dla i chcę wydrukować równoważny pływak o pojedynczej precyzji IEEE754 .

Użyj do tego celu intBitsToFloat().

+0

Bang. Tego właśnie szukałem. I widzę, że rewers to Float.floatToRawIntBits. Teraz potrzebuję wariantu Double/Long, ale zakładam, że jeśli taki będzie, to będzie w klasie Double. Znajdę to. Dzięki stosy. – paxdiablo

+2

Wciąż jestem zdezorientowany ... co to ma wspólnego ze związkami zawodowymi? – skaffman

+0

I +1. – paxdiablo

9

Substitutes for Missing C Constructs

Projektanci programowania Java język zdecydował się pominąć Unii konstrukt, ponieważ istnieje wiele lepszy mechanizm definiowania jednego typu danych zdolny do reprezentującą obiektów różnego typu: podtyp. Zróżnicowana unia jest tak naprawdę tylko błahą imitacją hierarchii klas.

Obejmuje przykłady.

+0

Tak, ale hierarchia klasowa nie jest tutaj dobra. Chcę móc ustawić go jako jeden typ i odczytać go jako inny. Hierarchia klas zmusi mnie do ustawienia jej i odczytania jako tego samego typu. – paxdiablo

+0

+1 za bardzo ładny link – dfa

+0

Wróćmy do góry - czy istnieje sposób na zmianę jednego bitu w float? Tego właśnie szukam.Chcę być w stanie ustawić (na przykład) bity 31, 27, 4 i 0 float, aby zobaczyć, jaka to wartość. – paxdiablo

5

Java nie zapewnia żadnego sposobu traktowania wartości jako innej wartości na surowym poziomie bitowym - bez związków, podobnie jak reinterpret_cast. Jednak w przypadku konkretnego przypadku leczenia float jako int i vice versa, można użyć metod: java.lang.Float.floatToIntBits i intBitsToFloat.

+0

+1 dla informacji, mimo że @MB po prostu Cię do tego pobiło. Dzięki. – paxdiablo

4

Jeśli jesteś zainteresowany w dostępie do reprezentacji nieco szczebla pływaka, java.lang.Double zawiera metody, aby to zrobić (doubleToLongBits etc.)

Union'ing pomiędzy rodzajami wskaźnika (lub pomiędzy wskaźnikami i ich Reprezentacja numeryczna) otwiera otwory w systemie typu, więc jest to absolutnie niemożliwe.

+1

+1. i to kończy moją misję (będę potrzebował tego podwójnie/długo później). Ta. – paxdiablo