Переписать функцию из JS

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Переписываю некоторый код из JS на PHP.

Есть такой код в JS:
Код:
a = b << c

Переписал в PHP:
Код:
$a = $b << $c;

Попробуем для начала a = 123; b = 3 - и в JS и в PHP ответ 984

Если взять такие входные данные:
a = 1367343104; b = 1
то есть выполнить 1367343104 << 1
в PHP получим 2734686208, а в JS -1560281088

Как так?

Перевод PHP:
Код:
1010001100000000000000000000000 ->
10100011000000000000000000000000

Перевод JS:
Код:
1010001100000000000000000000000 ->
-1011101000000000000000000000000

Чтобы протестировать код в браузере:
Нажми F12 в браузере, вставь в поле ввода 1367343104 << 1 нажми Enter

Код для php:
PHP:
var_dump(1367343104 << 1);

PHP:
PHP:
echo decbin(1367343104)."\r\n";
echo decbin(1367343104 << 1);
JS:
Код:
(1367343104).toString(2);
(1367343104 << 1).toString(2);
 
Последнее редактирование:
Для просмотра ссылки Войди или Зарегистрируйся
В JS операнды всех битовых операций конвертируются в 32-х битовые целые со знаком.

А в PHP таких ограничений нет и на 64-битных версиях получаешь 2734686208 без переполнения.
 
Для просмотра ссылки Войди или Зарегистрируйся
В JS операнды всех битовых операций конвертируются в 32-х битовые целые со знаком.

А в PHP таких ограничений нет и на 64-битных версиях получаешь 2734686208 без переполнения.
А как мне в PHP получать те же значения, что и в JS? Мне нужны полностью идентичные функции

В JS какой-то минус появляется, и закономерности не вижу - единицы в случайном порядке для меня тут в ответе, не имеющие связи с входными данными:
Код:
1010001100000000000000000000000 ->
-1011101000000000000000000000000
 
А как мне в PHP получать те же значения, что и в JS? Мне нужны полностью идентичные функции

В JS какой-то минус появляется, и закономерности не вижу - единицы в случайном порядке для меня тут в ответе, не имеющие связи с входными данными:
Код:
1010001100000000000000000000000 ->
-1011101000000000000000000000000
Почитайте про разрядность, и переполнение разрядной сетки - поймёте, откуда у джаваскрипта минус берётся в этой ситуации.
 
Обрезать результат до 32 бит.
Проверить какое значение имеет старший бит.
Если 0 то оставляем как есть.
Если 1 то число должно быть отрицательное и для этого заполняем единицами старшие 32 бита.
PHP:
$b = 163; $c = 24;

$a = $b << $c;
$a = ($a & 0xffffffff);
$a = ($a >> 31 == 0) ? $a : ($a | 0xffffffff00000000);

echo $a;
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Назад
Сверху