Что делает побитовый код «$n & ($n - 1)»?
-
20-09-2019 - |
Вопрос
Что означает этот код и каковы другие способы добиться того же самого без использования сдвига битов?
if ($n & ($n - 1))
Решение
Эта формула проверяет, является ли число степенью 2 (если ваше условие, как написано, верно, то число равно нет степень двойки).
Другими словами, ваш тест проверяет, установлено ли более одного бита «1» в двоичном представлении $n
.Если установлен ноль или только один бит, ваш тест будет ложным.
Это, безусловно, самый эффективный способ определить это свойство.
Другие советы
Во-первых, этот код является валидным PHP, поэтому ваш заголовок плохой.
Во-вторых, двоичная арифметика выглядит примерно так:
42 = 101010
&
41 = 101001
-----------
40 = 101000
Как утверждает Грег, это самый быстрый способ проверить степень числа 2, но код, который вы дали, проверяет, является ли число не степень 2.Это легко проверить с помощью политики PHP:любое ненулевое/ненулевое значение является истиной.