2013-01-20 12 views
5

Tak więc, używając mojej metody do wprowadzenia (niepoprawnie przesuniętej prawej strony w PHP), wynik jest niepoprawny, gdy liczby zawierają negatywy.Niepodpisane prawe przesunięcie PHP - Nieprawidłowe działanie

Wyniki PHP Zastosowanie:

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

WYNIKI JAVA APLIKACJI:

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

(najlepsze wyniki są prawidłowe, i generowane przez Java i dolne Wyniki są błędne i generowanych przez PHP)

To tylko wtedy, gdy liczba jest ujemna w PHP, która się nie powiedzie.

Przesunięcia wykorzystywane w tych zastosowaniach jest:

Proszę o pomoc, jeśli jest to możliwe!

Metoda dla przesunięcia w PHP:

function urshift($x, $n){ 
$mask = 0x40000000; 
if ($x < 0){ 
    $x &= 0x7FFFFFFF; 
    $mask = $mask >> ($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; 
+0

OK, nie jest jasne, w jaki sposób wyniki odpowiadają kodowi. Czy mógłbyś stworzyć [minimalny przypadek testowy] (http://sscce.org), który jasno pokazuje, w jaki sposób wykorzystywane są dane wejściowe i wyjściowe? –

+0

Naprawiłem to, aby było jasne, jakie są wejścia i wyjścia. –

Odpowiedz

6

Ten uRShift jest krótszy, pracuje poprawnie z 32- i 64-bitowych PHP i daje taki sam wynik jak w wersji Java na 32-bitowych PHP, który ma te same ints rozmiar jak 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 
+0

Przeniesienie następującego przykładu nie działa: -672461345 >>> 25 Według JS powinno być 107, jednak zwraca 549755813867. Szukałem twojego kodu i znalazłem go w kilku projektach open source, a ja zamierzam go użyć, więc byłoby dobrze, żeby to wyjaśnić. Zobacz więcej: http://stackoverflow.com/questions/24659911/unsigned-right-shift-function-not-working-for-negative-input – frzsombor

+0

UWAGA! Jeśli szukasz funkcji PHP, która daje taką samą wydajność jak JavaScript, w końcu znalazłem działające rozwiązanie! Więcej szczegółów, prezentacja na żywo, testy, przykłady: http://stackoverflow.com/a/43359819/2953830 – frzsombor

2

spróbować tej funkcji zamiast.

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; 
} 
Powiązane problemy