Po prostu z ciekawości, jak można stwierdzić, czy liczba x jest potęgą dwóch (x = 2^n) bez użycia rekursji.Ustalenie, czy liczba jest potęgą 2
Dzięki
Po prostu z ciekawości, jak można stwierdzić, czy liczba x jest potęgą dwóch (x = 2^n) bez użycia rekursji.Ustalenie, czy liczba jest potęgą 2
Dzięki
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.
Czy istnieje inny przypadek krawędzi przy wartości minimalnej dla int? – anon
@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
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2))
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
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 ...)
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
}
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.
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";
}
?>
Wystarczy sprawdzić pojedynczy bit. – phwd