Java использует IEEE 754 для кодирования поплавков. Часть от битов 22 до 0 в двоичном кодировании представляет собой мантису (m). Если т имеет ровно одну 1, то поплавок является степенью 2.
http://introcs.cs.princeton.edu/java/91float/
(-1)^s × m × 2^(e - 127)
знаковый бит (ы) (бит 31). Самый старший бит представляет знак числа (1 для отрицательного, 0 для положительного).
Экспоненциальное поле (e) (бит 30 - 23). Следующие 8 бит представляют экспоненту. По соглашению экспонента смещается на 127. Это означает, что для представления двоичного показателя 5 мы кодируем 127 + 5 = 132 в двоичном (10000100). Чтобы представить двоичный показатель -5, мы кодируем 127 - 5 = 122 в двоичном (01111010). Это соглашение является альтернативой нотации дополнений двух для представления отрицательных целых чисел.
Mantissa (m) (бит 22 - 0). Оставшиеся 23 бита представляют собой мантисс, нормализованные между 0,5 и 1. Эта нормализация всегда возможна, соответственно корректируя бинарный показатель. Двоичные фракции работают как десятичные дроби: 0.1101 представляет 1/2 + 1/4 + 1/16 = 13/16 = 0,8125. Не каждое десятичное число может быть представлено как двоичная дробь. Например, 1/10 = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192 + ... В этом случае число 0,1 аппроксимируется ближайшей 23-битной двоичной фракцией 0,000110011001100110011 ... Используется еще одна оптимизация. Поскольку мантисса всегда начинается с 1, нет необходимости явно хранить этот скрытый бит.
isPowerOf2 (1/x) = isPowerOf2 (x). Однако я сомневаюсь, что число> 1 случай «легко писать» полезным способом –
@Aakash Как это непонятно? «Легко проверить, является ли целое число в два раза, и как это сделать с нецелыми?» – immibis
Вы можете написать их одинаково для всех чисел, кроме денонмов, но это, вероятно, использует другой трюк, чем вы имели в виду. – harold