Учитывая реальное двоичное представление IEEE, как получить его истинное двоичное представление в Java? - PullRequest
0 голосов
/ 05 октября 2011

Мне просто интересно, как использовать битовые операции для достижения цели: учитывая IEEE двоичное представление вещественного числа, например, 40AC0000 (5,375 в десятичном виде), как получить его истинное двоичное представление (ожидая 101.011 для примера) в Java?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Это довольно сложный вопрос, особенно если вы еще не знаете, что такое IEEE.

Поскольку в вашем числе 4 байта, это одинарная точность.Это означает, что он имеет структуру из 1 знакового бита, 8 экспонентных битов и 23 битов Мантиссы.Знаковый бит очевиден.Значение битов экспоненты влияет на то, как вы интерпретируете биты Мантиссы.Сначала проверьте 8 битов экспоненты.Если все они равны 0, у вас есть денормализованное число;если они все равны 1, у вас есть значение бесконечности или NaN;в противном случае оно нормализуется.

В нормированном виде возьмите биты экспоненты, интерпретируйте его как 8-битное число и вычтите из него 127_10 (или 0xf7).Это ваш показатель.Затем возьмите оставшиеся биты мантиссы, добавьте ведущий 1. Ваш результат будет тогда (-1) ^ [Знак] * 1. [Мантисса] * 2 ^ [Экспонент].

Если это денормализованное число,Ваш показатель равен -126 (1-127).В этом случае интерпретируйте как (-1) ^ [Знак] * 0. [Мантисса] * 2 ^ [Экспонент].

В остальных случаях, если для Мантиссы все 0, ваше число равно (-1) ^ [Знак] * бесконечность.В противном случае ваш поплавок будет NaN.

Надеюсь, это поможет.

0 голосов
/ 05 октября 2011

Что вы подразумеваете под "истинным двоичным представлением"? В шестнадцатеричном представлении нет ничего "неверного" (40AC0000).

Вы можете конвертировать между различными осями (шестнадцатеричные, двоичные, десятичные), используя методы Integer:

Float.floatToIntBits(new Float("5.375"));
// = 1085014016

Integer.toString(1085014016, 16);
// = "40ac0000"

Integer.valueOf("40AC0000", 16);
// = 1085014016

Integer.toString(1085014016, 2); 
// returns 1000000101011000000000000000000
0 голосов
/ 05 октября 2011

Вы имеете в виду Float.floatToIntBits () и Float.intBitsToFloat ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...