Непонятный приоритет операции сдвига битов - PullRequest
0 голосов
/ 27 июня 2019

Я боролся с оператором shift в PHP, предполагая, что он предшествует арифметическим операциям, таким как +, 1 и т. Д. Я не смог найти никакого определения этого в руководстве по php.

Допустим, у меня есть значение 1, которое я хочу 3, затем 7 и т. Д., Заполняя биты справа (LSB).

Я пытался:

$X = 1;

Затем в цикле:

$X <<= 1 + 1; // returns 4 instead of 3.
$X <<= 1 + 1; // returns 16 instead of 7.

Итак, очевидно, 1 + 1 рассчитывается ДО сдвига. Мое решение:

$X = 1;
$X <<= 1; // $X=2
$X += 1;  // $X=3 as expected
$X <<= 1; // $X=6
$X += 1;  // $X=7 as expected

Что немного более неуклюже, но возвращает правильные числа. Разве первый метод не должен давать правильный результат, сначала сдвиг, а затем арифметика?

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

$X <<= 1 + 1

преобразуется в:

$X = $X << (1 + 1)

, если вы хотите сделать это по-другому, то вы можете использовать:

$X = ($X << 1) + 1

0 голосов
/ 29 июня 2019

Спасибо за ваши комментарии!На самом деле, «<< =» - это не только оператор, но и присвоение, поэтому </p>

$X <<= 1 + 1 will be interpreted as $X <<= 2.
$X = $X << 1 + 1 might possibly work (I haven't checked), but
$X = ($X << 1) + 1 as suggested by Ilya would be the right way.
0 голосов
/ 27 июня 2019

См. Таблицу Приоритет оператора *1002* и пояснения к ней.Оператор + имеет более высокий приоритет, чем <<=.Вы можете принудительно установить приоритет, сгруппировав скобки ():

$X = ($X <<= 1) + 1;

Также обратите внимание:

Использование скобок, даже если в этом нет особой необходимости, часто может повысить читабельность кодаделая явную группировку, а не полагаясь на неявный приоритет операторов и ассоциативность.

...