【发布时间】:2017-04-29 07:05:27
【问题描述】:
在将此标记为重复之前,请阅读以下内容并检查 my code * my updated code!
所以我的问题是,我必须实现 Java/JavaScript '>>>'(无符号右移 / 零填充右移),但我不能让它以完全相同的方式工作。
我选择了我在 SO 和 Web 上找到的 11 个最有前途的实现(链接在代码中作为 cmets 添加)并添加了一些测试用例。不幸的是,NONE 函数向所有测试返回了与 Java/JS 相同的响应。 (也许其中一些只适用于 32 位系统)
Live Code + 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:负数位移”。据此,我认为我们不必通过这些测试,所以我更新了问题和代码。
【问题讨论】:
标签: javascript java php bit-manipulation bit-shift