Вопрос оператора PHP if (& оператор)


Я использую функцию, которую нашел в Интернете. Что означает & в этом условном выражении?

if ($strength & 8) { $consonants .= '@#$%'; }

$сила должна быть числом 0-8. Функция намерена использовать все конкатенации $согласных, где $strength <8. (может объяснить, почему функция не работает).

Author: Oliver A., 2011-01-08

3 answers

Одиночный & является побитовым оператором, а двойной && является логическим. (т.Е. Биты, которые установлены как в $strength, так и в 8, установлены в вашем примере.) Это намного сложнее, чем просто сказать это, и это требует понимания того, как работает двоичный код.

РЕДАКТИРОВАТЬ: Ознакомьтесь с этой статьей для получения дополнительной информации о побитовых операторах.

 4
Author: Michael Irigoyen, 2011-01-07 21:57:03

& является побитовым оператором - он проверяет, установлены ли биты, которые составляют 8. В этом случае, 1000

 3
Author: Demian Brecht, 2011-01-07 21:58:50

& является побитовым оператором. Он объединяет два значения побитово.

Что такое побитовый оператор?

Каждое целое число внутренне представлено в виде числа битов.

1 is 0001
2 is 0010
4 is 0100
8 is 1000

И так далее. значение каждого бита в два раза больше, чем значение предыдущего бита.

Вы можете получить другие числа, комбинируя биты

3 is 0011 (2+1)
5 is 0101 (4+1)

Побитовая операция работает с каждым битом в обеих переменных. & устанавливает каждый бит в результате равным 1, если он равен 1 в обоих значения, на которых он работает.

9&5 == 1

Потому что

9 == 1001
5 == 0101
----------
1 == 0001

|объединит все 1:

3|5 == 7

3 == 0011
5 == 0101
---------
7 == 0111

Как вы можете его использовать?

Пример:

define('LOG_WARNING',1);
define('LOG_IO',2);
define('LOG_ALIENATTACKS,4);

$myLogLevel = LOG_WARNING | LOG_ALIENATACKS;

Теперь $myLogLevel представляет собой комбинацию LOG_WARNING и LOG_ALIENATTACK. Вы можете проверить это с помощью оператора &:

if($myLogLevel&LOG_WARNING).... //true
if($myLogLevel&LOG_IO).... //false
if($myLogLevel&LOG_ALIENATTACKS)..../ /true run or your live!!!

Если вы хотите узнать больше об этой теме, выполните поиск битовых флагов и двоичных операций.

 3
Author: Oliver A., 2015-09-20 09:01:13