PHP Unsigned Right Shift – Malfuncionamiento

Entonces, cuando uso mi método para preformar un desplazamiento a la derecha (>>>) sin signo en PHP, el resultado es incorrecto cuando los números implican negativos.

Resultados de la aplicación PHP:

INPUT: 10 >>> 3 INPUT: -10 >>> 3 OUTPUT: 1 OUTPUT: 2684354558 

RESULTADOS DE LA APLICACIÓN DE JAVA:

 INPUT: 10 >>> 3 INPUT: -10 >>> 3 OUTPUT: 1 OUTPUT: 536870910 

(Los mejores resultados son correctos y generados por Java y luego los resultados inferiores son incorrectos y generados por PHP)

Solo cuando el número es negativo en PHP, falla.

Los turnos que se usan en esas aplicaciones son:

¡Por favor ayuda si puedes!

Método para cambiar en PHP:

 function urshift($x, $n){ $mask = 0x40000000; if ($x > ($n-1); $ret = ($x >> $n) | $mask; $ret = str_pad(decbin($ret), 32, '0', STR_PAD_LEFT); $ret[0] = '1'; $ret = bindec($ret); } else { $ret = (int)$x >> (int)$n; } return $ret; 

Este uRShift es más corto, funciona correctamente con PHP de 32 y 64 bits y da el mismo resultado que la versión de Java en PHP de 32 bits que tiene el mismo tamaño que en Java;

 function uRShift($a, $b) { if($b == 0) return $a; return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1)); } > uRShift(-10,3) 536870910 > uRShift(10,3) 1 

prueba esta función en su lugar.

 function uRShift($a, $b) { $z = hexdec(80000000); if ($z & $a) { $a = ($a >> 1); $a &= (~$z); $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; }