2013-01-20 13 views
5

Quindi, quando si utilizza il mio metodo per preformare un (>>>) spostamento di zero senza segno in PHP, il risultato non è corretto quando i numeri coinvolgono i negativi.PHP Unsigned Right Shift - Malfunctioning

Risultati di applicazioni PHP:

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

Java Application RISULTATI:

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

(I primi risultati sono corretti e generato da Java e quindi i risultati inferiori sono errate e generato da PHP)

È solo quando il numero è negativo in PHP che non riesce.

I turni utilizzate in quelle applicazioni è:

Aiutateci se potete!

Metodo per spostare in 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, non è chiaro in che modo i risultati corrispondono al codice. Potresti creare un [test-case minimale] (http://sscce.org) che dimostra chiaramente come vengono utilizzati gli input e gli output? –

+0

L'ho risolto quindi è chiaro che cosa sono l'input e l'output. –

risposta

6

Questa uRShift è più breve, funziona correttamente con 32 e 64 bit di PHP e dà lo stesso risultato come la versione di Java a 32 bit PHP che ha le stesse dimensioni come int 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

Cambiare il seguente esempio non funziona: -672461345 >>> 25 Secondo JS, dovrebbe essere 107, tuttavia restituisce 549755813867. Ho cercato il tuo codice e l'ho trovato in un paio di progetti open source, e sto per usarlo, quindi sarebbe bello, chiarire le cose. Ulteriori informazioni: http://stackoverflow.com/questions/24659911/unsigned-right-shift-function-not-working-for-negative-input – frzsombor

+0

ATTENZIONE! Se stai cercando una funzione PHP che fornisce lo stesso risultato di JavaScript, ho finalmente trovato una soluzione funzionante! Maggiori dettagli, demo dal vivo, test, esempi: http://stackoverflow.com/a/43359819/2953830 – frzsombor

2

provare questa funzione invece.

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; 
}