Как выполнить правильную сдвиг без изменений в PHP?

Можно ли получить те же результаты в PHP и Javascript?

Пример:

Javascript

<script> function urshift(a, b) { return a >>> b; } document.write(urshift(10,3)+"<br />"); document.write(urshift(-10,3)+"<br />"); document.write(urshift(33, 33)+"<br />"); document.write(urshift(-10, -30)+"<br />"); document.write(urshift(-14, 5)+"<br />"); </script> 

вывод:

 1 536870910 16 1073741821 134217727 

PHP

 function uRShift($a, $b) { if ($a < 0) { $a = ($a >> 1); $a &= 2147483647; $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; } echo uRShift(10,3)."<br />"; echo uRShift(-10,3)."<br />"; echo uRShift(33,33)."<br />"; echo uRShift(-10,-30)."<br />"; echo uRShift(-14,5)."<br />"; 

вывод:

 1 536870910 0 0 134217727 

Можно ли получить те же результаты?

Ближайшая функция к тому, что я хочу, здесь:

Функция незаписанного сдвига вправо не работает для отрицательного входа

Спасибо за помощь.

Solutions Collecting From Web of "Как выполнить правильную сдвиг без изменений в PHP?"

Попробуйте эту функцию:

 function unsigned_shift_right($value, $steps) { if ($steps == 0) { return $value; } return ($value >> $steps) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($steps - 1)); } 

Результат, основанный на вашем примере кода:

 1 536870910 16 1073741821 134217727 

Наконец, я думаю, что нашел решение, которое я не знаю почему, но этот код работает для меня:

 function uRShift($a, $b) { if ($b > 32 || $b < -32) { $m = (int)($b/32); $b = $b-($m*32); } if ($b < 0) $b = 32 + $b; if ($a < 0) { $a = ($a >> 1); $a &= 2147483647; $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; }