Определение того, является ли число силой 2

Просто из любопытства, как вы можете сказать, если число x является степенью двух (x = 2 ^ n) без использования рекурсии.

благодаря

Один из способов – использовать побитовое И. Если число $x является степенью двух (например, 8 = 1000), у него не будет битов, общих с его предшественником (7 = 0111). Поэтому вы можете написать:

 ($x & ($x - 1)) == 0 

Примечание. Это даст ложное значение для $ x == 0.

Вычтите 1 из числа, затем и его с исходным номером. Если результат равен нулю, это значение равно двум.

 if (((n-1) & n) == 0) { // power of two! } 

(извините, мой PHP ржавый …)

Если это сила 2? Ну, один из способов – преобразовать его в двоичный код и проверить наличие только 1 1 …:

 $bin = decbin($number); if (preg_match('/^0*10*$/', $bin)) { //Even Power Of 2 } 

Для полноты, если число является поплавком, вы можете проверить, является ли это силой двух путем chacking, если мантисса – все нули:

 <?php $number = 1.2379400392853803e27; $d = unpack("h*", pack("d", $number)); $d = reset($d); $isPowerOfTwo = substr($d, 0, 13) == "0000000000000"; var_dump($isPowerOfTwo); // bool(true) 

Упражнение для читателя: угловые шкафы и машины большого конца.

В двоичном эквиваленте любого десятичного числа, которое является степенью двух, будет иметь только одно вхождение 1 в его двоичном эквиваленте.

 <?php $number = 4096; $bin = decbin($number); if ($number != 1 && substr_count($bin,1) == 1) { echo "Yes"; } else { echo "No"; } ?> 
 Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))