Может кто-нибудь, пожалуйста, объясните мне, почему это равно 32
?
$a = 4 << 2 + 1;
echo $a;
Выход:
32
Я прочитал руководство и узнал, что <<
немного сдвинулся влево, но все еще не совсем понял концепцию.
Если мы разделим проблему на шаги, за ней станет легко следить. Сначала я объясню побитовую часть, чтобы любой, кто достигнет этого вопроса, понял. В конце вы можете увидеть упоминание о вашей проблеме.
Начните:
$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
,
Других решений пока нет …