2009-08-21 2 views
5

Должен признаться во всей моей работе с Java, я никогда не сталкивался с необходимостью для объединения Java (например, C-соединения, а не SQL-кода), и я не могу найти ответ здесь на SO. По общему признанию, большая часть моей работы на Java была на более высоких абстракциях, чем бит-возиться.Как я могу получить/установить отдельные биты в поплавке?

У меня есть целое число, для которого я устанавливаю отдельные биты, и я хочу распечатать эквивалентный поплавок IEEE754 с одной точностью.

В C, я бы что-то вроде:

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

Как сделать подобную вещь в Java? Можно ли даже обрабатывать одну и ту же память как два разных типа данных в Java?

Я выполнял поиск как в SO, так и в других местах для «java union», но это затачивало меня SQL-материалами - я не мог найти способ сделать это.

ответ

12

У меня есть целое число, которое я устанавливаю отдельные биты для и я хочу распечатки эквивалентный IEEE75 поплавок с одной точностью.

Используйте для этого intBitsToFloat().

+0

Банг. Это то, чем я был. И я вижу, что обратное - Float.floatToRawIntBits. Теперь мне просто нужен вариант Double/Long, но я предполагаю, что если он есть, он будет в классе Double. Я пойду. Спасибо, кучи. – paxdiablo

+2

Я все еще смущен ... что это имеет отношение к профсоюзам? – skaffman

+0

И +1. – paxdiablo

9

Substitutes for Missing C Constructs

Проектировщики Java программирование языка решили опустить конструкцию союза , потому что есть много более совершенный механизм для определения одного типа данных, способный представлять объекты различных типов: подтипы. A дискриминированный союз - это всего лишь бледная имитация иерархии классов.

Включает примеры.

+0

Да, но иерархия классов здесь не годится. Я хочу иметь возможность установить его как один тип и прочитать его как другой. Иерархия классов заставит меня установить ее и прочитать ее как один и тот же тип. – paxdiablo

+0

+1 для очень хорошей ссылки – dfa

+0

Давайте создадим резервную копию - есть ли способ изменить один бит в поплавке? Это то, что я ищу.Я хочу иметь возможность устанавливать (например) биты 31, 27, 4 и 0 поплавка, чтобы узнать, какое значение это значение. – paxdiablo

5

Java не предоставляет никакого способа обработки значения как другого значения на уровне сырого бита - без объединений, ничего подобного reinterpret_cast. Однако для вашего конкретного случая лечения float как int и наоборот, вы можете использовать методы java.lang.Float.floatToIntBits и intBitsToFloat.

+0

+1 для информации, хотя @MB просто избил вас. Благодарю. – paxdiablo

4

Если вы заинтересованы в получении доступа представление битового уровня поплавка, java.lang.Double содержит метод, чтобы сделать это (doubleToLongBits и т.д.)

Union'ing между типами указателей (или между указателями и их числовое представление) откроет дыры в системе типов, поэтому это абсолютно невозможно.

+1

+1. и это завершает мой квест (мне понадобится это для двойного/длинного позже). Ta. – paxdiablo

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