Побитовое ИЛИ, проблемка

134
17 июля 2019, 13:10

Переписываю некий код с яваскрипта на пхп

function level(k, d) {
    return (k << d) | (k >>> (32 - d))
}

Получилось

function level($k, $d) {
    return ($k << $d) | abs($k >> (32 - $d));
}

Но вот проблемка, на level(14,8) яваскрипт и пхп возвращают одинаково 3584. На более крупных бяка level(10000,30):

10737418240000 | 2500 //js 2500
10737418240000 | 2500 //php 10737418242500

Где сделал ошибку?

песочница http://sandbox.onlinephpfunctions.com/code/aed1b6d153c7c21518c317664a0a1b4d24dd2070

Answer 1

Проблема заключается в том, что битовые операторы в javascript работают только с 32х битными числами.

Все операнды и результат в итоге приводятся в 32х битному числу.

Например в случае со сдвигом влево реальное число будет 10737418240000, если перевести его в двоичный вид, получим следующее:

10011100010000000000000000000000000000000000

Как можно заменить последние 32 символа 0, что дает при приведении к 32х битному числу - 0.

Таким образом 10000 << 30 == 0

Далее идет побитовое ИЛИ c 2500, и так как в исходном числе все 0 - получаем 2500.

В php такого ограничения нет.

READ ALSO
Как отловить событие &ldquo;доскроллили до самого низа страницы&rdquo;?

Как отловить событие “доскроллили до самого низа страницы”?

Как сделать, когда доскролишь до самого низа страницы, чтобы поменялся background, как отловить тот момент, когда уже уперлись в самый низ страницы...

139
Не вешается событие keydown javascript

Не вешается событие keydown javascript

Привет все есть такой код

148
Как изменить поведение FOREIGN KEY

Как изменить поведение FOREIGN KEY

Имеется таблица со вторичным ключом с поведением ON DELETE SET NULL

196
Не запускается видео на странице

Не запускается видео на странице

Появляются иконки видео (звук, дорожка воспроизведения, кнопка увеличения экрана и тд

189