Определение того, является ли число силой 2
Просто из любопытства, как вы можете сказать, если число x является степенью двух (x = 2 ^ n) без использования рекурсии.
Спасибо
Ответы
Ответ 1
Один из способов - использовать побитовое И. Если число $x
равно двум (например, 8 = 1000), оно не будет иметь битов, общих с его предшественником (7 = 0111). Поэтому вы можете написать:
($x & ($x - 1)) == 0
Примечание. Это даст ложное положительное значение для $x == 0.
Ответ 2
Вычтите 1 из числа, затем и его с исходным номером. Если результат равен нулю, это значение равно двум.
if (((n-1) & n) == 0) {
// power of two!
}
(извините, мой PHP ржавый...)
Ответ 3
Если это сила 2? Ну, один из способов - преобразовать его в двоичный файл и проверить наличие только 1 1
...:
$bin = decbin($number);
if (preg_match('/^0*10*$/', $bin)) {
//Even Power Of 2
}
Ответ 4
Для полноты, если число является поплавком, вы можете проверить, имеет ли он силу в два, если укусить, если мантисса - все нули:
<?php
$number = 1.2379400392853803e27;
$d = unpack("h*", pack("d", $number)); $d = reset($d);
$isPowerOfTwo = substr($d, 0, 13) == "0000000000000";
var_dump($isPowerOfTwo); // bool(true)
Упражнение для читателя: угловые шкафы и машины большого конца.
Ответ 5
В двоичном эквиваленте любого десятичного числа, которое является степенью двух, будет иметь только одно вхождение из 1 в его двоичном эквиваленте.
<?php
$number = 4096;
$bin = decbin($number);
if ($number != 1 && substr_count($bin,1) == 1) {
echo "Yes";
} else {
echo "No";
}
?>
Ответ 6
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))