2009-10-11 14 views
5

Co ten kod oznacza i jakie są inne sposoby osiągnięcia tego samego bez użycia zmiany bitowej?

if ($n & ($n - 1)) 
+2

To w rzeczywistości bitowe, a nie nieco przesunięcie. –

+1

Praca domowa? wywiad? :) – DVK

+0

Dlaczego miałbyś unikać operacji bitowych? – MAK

Odpowiedz

17

Formuła checks to see whether a number is a power of 2 (jeśli warunek jak napisane jest prawdą, to liczba jest nie potęgą dwójki).

Innymi słowy, Twój test sprawdza, czy w binarnej reprezentacji $n jest ustawiony więcej niż jeden bit "1". Jeśli jest ustawiony zero lub tylko jeden bit, twój test będzie fałszywy.

Jest to zdecydowanie najbardziej efektywny sposób określenia tej właściwości.

+1

Greg, pytanie jest w istocie adaptacją, która sprawdza, czy liczba nie jest potęgą dwójki. Bez '== 0' PHP przyjmuje dowolną niezerową wartość jako true. –

+0

Tak, myślałem, że logiczna negacja będzie jasna. Niemniej jednak poprawiłem moją odpowiedź, aby to wyraźnie podkreślić. –

+0

Cóż, to nie jest negacja na pierwszy rzut oka (to byłoby "! = 0"), a moim wrażeniem eyze jest to, że jest na poziomie początkującym. –

5

Po pierwsze, ten kod jest prawidłowy w PHP, więc Twój tytuł jest słaby.

drugie, arytmetyki binarnej dzieje wygląda mniej więcej tak:

42 = 101010 
    & 
41 = 101001 
----------- 
40 = 101000 

jak Greg członkowskich jest to najszybszy sposób, aby sprawdzić, o mocy 2 liczby, ale kod dałeś sprawdza, jeśli numer to , nie ma mocy 2. Można to łatwo stwierdzić na podstawie polityki PHP: każda wartość inna niż zero/zero jest prawdą.