Что делает побитовый код "$ n & ($ n - 1)"? - PullRequest
6 голосов
/ 11 октября 2009

Что означает этот код и как это можно сделать другими способами без использования битового сдвига?

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

Ответы [ 2 ]

17 голосов
/ 11 октября 2009

Эта формула проверяет, является ли число степенью 2 (если ваше условие, как написано, истинно, тогда число равно , а не степень двух).

Другими словами, ваш тест проверяет, установлено ли более одного бита "1" в двоичном представлении $n. Если установлен ноль или только один бит, то ваш тест будет ложным.

На сегодняшний день это самый эффективный способ определить это свойство.

5 голосов
/ 11 октября 2009

Во-первых, это правильный код PHP, поэтому ваш заголовок плохой.

Во-вторых, двоичная арифметика выглядит примерно так:

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

Как и Грег, это самый быстрый способ проверить степень 2, но код, который вы дали, проверяет, является ли число не степенью 2 . Это может быть легко установлено политикой PHP: любое ненулевое / ненулевое значение имеет значение true.

...