Bevor Sie dies als Duplikat markieren, lesen Sie bitte unten und überprüfen Sie my code * my updated code!Vorzeichenlose Rechtsverschiebung/Nullfüllung Rechtsverschiebung in PHP (Java/JavaScript gleichwertig)
Also mein Problem ist, dass ich Java/JavaScript ">>>" (Unsigned Rechts Shift/Zero-Fill Rechts Shift) implementieren muss, aber ich kann es nicht genau so funktionieren.
Ich habe die 11 vielversprechendsten Implementierungen ausgewählt, die ich auf SO und im Internet gefunden habe (Links werden als Kommentare im Code hinzugefügt), und ein paar Testfälle hinzugefügt. Leider KEINE der Funktionen gab die gleiche Antwort wie Java/JS für alle Tests zurück. (einige von ihnen arbeiten nur auf 32-Bit-Systeme Vielleicht)
Live Code + JS + PHP Demo führt (auf Ausführen):
http://phpfiddle.org/main/code/bcv7-bs2q *
http://phpfiddle.org/main/code/dpkw-rxfe
Die nächsten Funktionen sind:
// http://stackoverflow.com/a/27263298
function shr9($a,$b) {
if($a>=0) return $a>>$b;
if($b==0) return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1);
return ((~$a)>>$b)^(0x7fffffff>>($b-1));
}
und
// http://stackoverflow.com/a/25467712
function shr11($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;
}
Leider scheitert shr9 an (-10 >>> -3) und * (32 >> 32), aber ist die nur zu übergeben (-3 >>> 0); und shr11 scheitert an (-3 >>> 0) und auch (32 >>> 32).
Testfälle:
0 >>> 3 == 0
3 >>> 0 == 3
0 >>> -3 == 0
-3 >>> 0 == 4294967293 (in JS); -3 (in Java)
10 >>> 3 == 1
10 >>> -3 == 0
-10 >>> 3 == 536870910
-10 >>> -3 == 7
-672461345 >>> 25 == 107
32 >>> 32 == 32
128 >>> 128 == 128
Edit: Ich fand, dass -3 >>> 0
ist gleich 4294967293
nur in JavaScript , aber in Java, entspricht es -3
(warum?). Leider ändert dies nichts an der Tatsache, dass ich immer noch keine Funktion bekomme, alle Tests zu bestehen.
* BIG UPDATE:
Da PHP 7, Bitverschiebung durch eine negative Zahl wird als ungültig angesehen und führt zu: "Fatal error: Uncaught ArithmeticError: Bit Verschiebung um negative Zahl" . Daher denke ich, dass wir diese Tests nicht bestehen müssen, also habe ich die Frage und die Codes aktualisiert.
Benchmark: http://phpfiddle.org/main/code/1x1n-kzfc – frzsombor