2015-08-16 2 views

ответ

3

Если n это сила 2, то его двоичное представление будет начинаться с 1 и будет содержать только 0 с после него.

Итак, вы можете сделать:

String binary = Integer.toBinaryString(a); 
Pattern powerOfTwoPattern = Pattern.compile("10*"); 
System.out.println(powerOfTwoPattern.matcher(binary).matches()); 

Во всяком случае, если вы номер не действительно огромен (т.е. соответствует int или long диапазон), то вы можете следовать предложениям here

0

Вы можете использовать ниже методы: -

boolean isPowerOfTwo (int x) 
{ 
    while (((x % 2) == 0) && x > 1) /* While x is even and > 1 */ 
    x /= 2; 
    return (x == 1); 
} 

Explanation: - Несколько раз делит й на 2. Он делит пока либо фактор не станет s 1, и в этом случае x является степенью двух, или частное становится нечетным до достижения 1, и в этом случае x не является степенью двух.

0

псевдокода следующий, легко адаптировать к 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