PHP / побитовые операторы левый сдвиг

Может кто-нибудь, пожалуйста, объясните мне, почему это равно 32?

$a = 4 << 2 + 1;
echo $a;

Выход:

32

Я прочитал руководство и узнал, что << немного сдвинулся влево, но все еще не совсем понял концепцию.

-1

Решение

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


Начните:

$v = 4;

Сначала мы проверяем, сколько бит необходимо для этого значения.

echo decbin($v); // 3 bits (100)

Затем мы оставили сдвиг на два:

echo $v << 2; // the value is now 16. Why?

потому что если мы проверим биты:

echo decbin($v << 2); // 5 bits (10000) -> the previous 3 bits + 2 shifted
//                                  /\ check that there are more 2 bits now


Но мы получаем 32 в результате, почему это? Ну, потому что в этом случае + приходит первым Сначала оценивается сумма (2 + 1) и только потом сдвигается. Ваш код такой же, как 4 << (2 + 1),

Если мы проверим шаги, как и раньше, но знание оно будет суммироваться первым, оно фактически сразит его на 3, а последнее значение будет иметь 6 бит.

И если мы преобразуем значение, которое было смещено на 3 (100000), мы получим 32,

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector