псевдокода следующий, легко адаптировать к Java
boolean is_power_of_two(int num)
{
int i = Math.ceil(Math.log(num)/Math.log(2.0));
/*while (i >= 0)
{
// note 1 is taken as power of 2, i.e 2^0
// chnage i > 0 above to avoid this
if (num == (1 << i)) return true;
i--;
}
return false;*/
// or even this, since i is initialised in maximum power of two that num can have
return (num == (1 << i)) || (num == (1 << (i-1)));
}
Примечания она также может быть сделана с дискретным логарифмом в постоянная время без компиляции, чтобы строки represenation и т.д., но нуждается в предварительно вычисленную таблице дискретных логарифмов для базы 2
или даже с использованием бинарных манипуляций, как в https://stackoverflow.com/a/600306/3591273, эти подходы являются постоянными, но используют представление по умолчанию машины int
или long