2011-02-11 13 views

Odpowiedz

39

Jednym sposobem jest użycie logiczną AND. Jeśli liczba $x jest potęgą dwóch (na przykład 8 = 1000), nie będzie miała bitów wspólnych z jego poprzednikiem (7 = 0111). Więc można napisać:

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

Uwaga: To daje fałszywy alarm dla $ x == 0.

+1

Czy istnieje inny przypadek krawędzi przy wartości minimalnej dla int? – anon

+1

@anon - Wyrażenie zawsze zwraca wartość niezerową, jeśli wartość początkowa zawiera wiele bitów. Minimalna wartość int ma ustawiony jeden bit, ze względu na użycie dwóch dodatków (na większości platform), ale nie jest potęgą 2. Tak, myślę, że masz rację. Dostajesz (dla przypadku 8 bitów) 10000000 i 01111111 == 0, co byłoby prawdą, gdyby były to niepodpisane wartości (128 to potęga 2), ale nie dla wartości podpisanych (-128 nie jest potęgą 2). – Steve314

-2
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2)) 
+1

To wygląda na rozsądne rozwiązanie w Javie na pierwszy rzut oka - ** ale nie jest! ** Nigdy nie porównuj funkcji pływających/podwójnych z operatorem '=='! – SebastianH

8

Odejmij 1 od liczby, a następnie go z oryginalnego numeru. Jeśli wynik jest zerowy, to potęga dwóch.

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

(przepraszam, mój PHP jest zardzewiały ...)

+3

haha ​​to nie jest PHP! zmienne są bardzo bogate i bogate! – mauris

+0

Szkoda, że ​​to nie jest błąd składniowy, jeśli zostawisz zmienne zepsute. – dan04

3

Jeśli jest potęgą 2? Cóż, jednym ze sposobów jest, aby przekształcić go na binarny i sprawdzić obecność tylko 1 1 ...:

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

Dla kompletności, jeśli liczba jest float, można sprawdzić, czy jest potęgą dwójki przez Chacking jeśli mantysa jest zerami:

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

ćwiczenie dla czytelnika: Szafy narożne i maszyny grubokońcej.

0

W binarnym odpowiedniku dowolnej liczby dziesiętnej, która jest potęgą dwóch, występuje tylko jedno wystąpienie 1 w jego binarnym odpowiedniku.

<?php 
    $number = 4096; 
    $bin = decbin($number); 
    if ($number != 1 && substr_count($bin,1) == 1) { 
     echo "Yes"; 
    } else { 
     echo "No"; 
    } 
?> 
Powiązane problemy