Просто из любопытства, как вы можете сказать, если число 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))