Операции приоритета и битовой маски

94

Я столкнулся с (казалось бы) очень странным случаем.

Возьмите число 2 ( 0b10) и замаскируйте его с помощью 1 ( 0b01)

Это должно произвести 0b00что эквивалентно 0.

Однако здесь появляется г-н Шредингер:

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)

Виски. Танго. Фокстрот.

По общему признанию, я не самый разбирающийся в побитовых операторах - так что, может быть, я где-то ужасно, ужасно ошибся?

Однако в Python:

0b10 & 0b01 == 0 знак равно True

0b10 & 0b01 != 0 знак равно False

...так?

Дэнни Коппинг
источник
Я не использую PHP, но в C, C ++ вы могли бы просто написать какvar_dump(!(0b10 & 0b01))
Grijesh Chauhan
2
Что-то еще более странное: в некоторых версиях 0b0+1оценивается как 2из-за ошибки парсера.
Лили Чанг

Ответы:

150

Фактически вы делаете это:

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));

Пытаться:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Мэтью
источник
6
Мне кажется, что PHP имеет приоритет оператора strnage в целом.
Элвин Вонг,
23
Думаю, именно поэтому я НИКОГДА не полагаюсь на приоритет в любом языке. Более того, я считаю, что скобки делают код более читабельным. В крайних случаях вы можете захотеть (пере) сгруппировать и кратко комментировать материал.
Нет ответа
2
@AlvinWong Вы правы! Я думаю, что редко в коде требуется условное выражение, например, 0b10 & (0b01 == 0)зачем кому-то применять побитовое с да нет информации.
Grijesh Chauhan
4
Что ж, рассмотрим более распространенный пример: тернарный оператор, PHP имеет его наоборот, что делает его отличным от всех других языков. Ссылка: phpsadness
Элвин Вонг,
5
Вот почему в C и C ++ есть предупреждения об этих вещах.
PlasmaHH