Операції з перевагою та бітовою маскою


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через помилку парсера.
Lily Chung

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.