Что делает побитовый код "$n& ($n - 1)"?


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

if ($n & ($n - 1))
Author: Alix Axel, 2009-10-11

2 answers

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

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

Это, безусловно, самый эффективный способ определить это свойство.

 17
Author: Greg Hewgill, 2017-05-23 11:43:51

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

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

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

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

 5
Author: Robert K, 2009-10-11 19:24:27