Javascript код:
console.log( 1 << 5 );
console.log( 1111044149 << 2 );
Вывод Javascript:
32
149209300
Код PHP:
var_dump( 1 << 5 );
var_dump( 1111044149 << 2 );
Выход PHP:
32
4444176596
Зачем 1111044149 << 2
есть разница между PHP и JavaScript? Я пишу код JavaScript в PHP, и все работало меньше, чем эта часть, и мне нужно, чтобы код PHP показывал аналогичные результаты, полученные в JavaScript, чтобы быть идеальным.
Операнды побитовой операции в JavaScript всегда рассматриваются как int32, а в PHP это не так. Итак, при выполнении левого сдвига на 1111044149
это происходит в JS:
01000010001110010011000000110101 (original, 32-bit)
00001000111001001100000011010100 (left shifted 2 positions, "01" is truncated)
= 149209300
А в PHP биты не усекаются, потому что это не рассматривается как 32-разрядное целое число.
Спасибо за объяснения, они мне очень помогли, и теперь я мог создать функцию для автоматического преобразования. Я забыл эту деталь о 32-разрядной и 64-разрядной версиях из-за отсутствия внимания.
функция
function shift_left_32( $a, $b ) {
return ( $c = $a << $b ) && $c >= 4294967296 ? $c - 4294967296 : $c;
}
Тестовое задание
var_dump( shift_left_32( 1, 5 ) );
var_dump( shift_left_32( 1111044149, 2 ) );
Выход
32
149209300