在將其標記爲副本之前,請閱讀以下內容並檢查my code * my updated code!PHP中的無符號右移/零填充右移(Java/JavaScript等效)
所以我的問題是,我必須實現Java/JavaScript'>>>'(無符號右移/零填充右移),但我無法完全按照相同的方式工作。
我選擇了我在SO和網上找到的11個最有希望的實現(鏈接添加爲代碼中的註釋)並添加了一些測試用例。不幸的是NONE對所有的測試都返回了與Java/JS相同的響應。 (也許有些人只工作在32位系統)
實時代碼+ JS + PHP結果演示(單擊運行):
http://phpfiddle.org/main/code/bcv7-bs2q *
http://phpfiddle.org/main/code/dpkw-rxfe
最接近的功能是:
// 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));
}
和
// 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;
}
不幸的是,shr9在(-10 >>> -3)和 *(32 >> 32)上失敗,但是只有才能通過(-3 >>> 0);並且shr11在(-3 >>> 0)和(32 >>> 32)上失敗。
測試用例:
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
編輯:我發現-3 >>> 0
只有在JavaScript 等於4294967293
,但在Java中,它等於-3
(爲什麼?)。不幸的是,這並沒有改變我仍然無法通過所有測試的功能。
*大的更新:
自PHP 7中,由負數位移位被認爲是無效的,並導致:「致命錯誤:未捕獲ArithmeticError:由負數位移」 。據此,我認爲我們不必通過這些測試,所以我更新了問題和代碼。
基準:http://phpfiddle.org/main/code/1x1n-kzfc – frzsombor