2013-01-20 10 views
5

Also, wenn meine Methode verwendet, um eine (>>>) unsigned rechts Verschiebung in PHP, ist das Ergebnis falsch, wenn die Zahlen negative enthalten.PHP Unsigned Right Shift - Fehlfunktion

PHP Application Ergebnisse:

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

Java-Anwendung ERGEBNISSE:

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

(Die Top-Ergebnisse korrekt sind und die durch Java und dann die unteren Ergebnisse sind falsch und erzeugt durch PHP)

Nur wenn die Zahl in PHP negativ ist, schlägt sie fehl.

Die Verschiebungen in diesen Anwendungen verwendet werden, ist:

Bitte helfen Sie, wenn Sie können!

Methode für in PHP Verschiebung:

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, es ist nicht klar, wie Ihre Ergebnisse mit Ihrem Code übereinstimmen. Könnten Sie einen [minimalen Testfall] (http://sscce.org) erstellen, der deutlich zeigt, wie die Inputs und Outputs verwendet werden? –

+0

Ich habe es behoben, damit klar ist, was er eingibt und ausgibt. –

Antwort

6

Diese uRShift kürzer ist, funktioniert ordnungsgemäß mit 32- und 64-Bit-PHP und gibt das gleiche Ergebnis wie die Java-Version auf 32-Bit-PHP die gleiche Größe ints wie Java hat;

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

Verschieben des folgenden Beispiels funktioniert nicht: -672461345 >>> 25 Laut JS sollte es 107 sein, aber es gibt 549755813867 zurück. Ich habe nach deinem Code gesucht und ihn in einigen Open-Source-Projekten gefunden, und ich bin dabei, ihn zu verwenden. Es wäre also gut, Dinge zu klären. Siehe mehr: http://stackoverflow.com/questions/24659911/unsigned-right-shift-function-not-working-for-negative-input – frzsombor

+0

ACHTUNG! Wenn Sie nach einer PHP-Funktion suchen, die dieselbe Ausgabe wie JavaScript liefert, habe ich endlich eine funktionierende Lösung gefunden! Weitere Details, Live-Demo, Tests, Beispiele: http://StackOverflow.com/a/43359819/2953830 – frzsombor

2

diese Funktion versuchen, statt.

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