Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 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))