Java添零右移_PHP中的无符号右移/零填充右移/ >>>(等效于Java / JavaScript)

在将其标记为重复项之前,请阅读以下内容,并检查 我更新的代码!

所以我的问题是,我必须实现Java / JavaScript’>>>’(无符号右移/零填充右移),但是我无法以完全相同的方式工作。

我选择了在SO和Web上找到的11个最有前途的实现(链接在代码中作为注释添加),并添加了一些测试用例。不幸的是 无 功能返回的Java /

JS相同响应的测试ALL。 (也许其中一些仅在32位系统上运行)

最接近的功能是:

// 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

编辑:我发现仅在JavaScript中-3 >>> 0等于 (为什么?)

,但在Java中等于。不幸的是,这并不能改变我仍然无法获得任何函数通过所有测试的事实。4294967293 __-3

*大更新:

从PHP 7开始,移位负数被认为是无效的,并导致:“ 致命错误:未捕获的ArithmeticError:移位负数

”。据此,我认为我们不必通过那些测试,因此我已经更新了问题和代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值