Java utilizza IEEE 754 per codificare i float. La porzione dai bit 22 a 0 nella codifica binaria rappresenta la mantissa (m). Se m è esattamente un 1, allora il galleggiante è una potenza di 2.
http://introcs.cs.princeton.edu/java/91float/
(-1)^s × m × 2^(e - 127)
bit di segno (s) (bit 31). Il bit più significativo rappresenta il segno del numero (1 per il negativo, 0 per il positivo).
Campo esponenziale (e) (bit 30 - 23). Gli 8 bit successivi rappresentano l'esponente. Per convenzione l'esponente è polarizzato di 127. Ciò significa che per rappresentare l'esponente binario 5, codifichiamo 127 + 5 = 132 in binario (10000100). Per rappresentare l'esponente binario -5 codifichiamo 127 - 5 = 122 in binario (01111010). Questa convenzione è alternativa alla notazione del complemento a due per la rappresentazione di numeri interi negativi.
Mantissa (m) (bit 22 - 0). I rimanenti 23 bit rappresentano la mantissa, normalizzata tra 0,5 e 1. Questa normalizzazione è sempre possibile regolando di conseguenza l'esponente binario. Le frazioni binarie funzionano come le frazioni decimali: 0,1101 rappresenta 1/2 + 1/4 + 1/16 = 13/16 = 0,8125. Non tutti i numeri decimali possono essere rappresentati come una frazione binaria. Ad esempio 1/10 = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192 + ... In questo caso, il numero 0.1 viene approssimato dalla frazione binaria 23 bit più vicina 0.000110011001100110011 ... Un'ulteriore ottimizzazione viene impiegata. Poiché la mantissa inizia sempre con un 1, non è necessario memorizzare esplicitamente questo bit nascosto.
isPowerOf2 (1/x) = isPowerOf2 (x). Tuttavia dubito che il numero> 1 caso sia "facile da scrivere" in maniera utile –
@Aakash Come è poco chiaro? "È facile verificare se un numero intero è una potenza di due, come faccio con i numeri interi?" – immibis
Puoi scriverli allo stesso modo per tutti i numeri tranne i denormali, ma probabilmente sta usando un trucco diverso da quello che avevi in mente. – harold