在研究了问题的两个函数(“ shr9”和“
shr11”)并合并/调整了好部分之后,我终于找到了解决方案。所有测试都通过了(我什至在演示中添加了更多内容),它也适用于负数班次。
[现场演示]
function unsignedRightShift($a, $b) { if ($b >= 32 || $b < -32) { $m = (int)($b/32); $b = $b-($m*32); } if ($b < 0) { $b = 32 + $b; } if ($b == 0) { return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1); } if ($a < 0) { $a = ($a >> 1); $a &= 0x7fffffff; $a |= 0x40000000; $a = ($a >> ($b - 1)); } else { $a = ($a >> $b); } return $a; }该代码不仅准确,而且速度也很快。
基准测试结果:100000次循环:0.25秒
基准测试:http :
//phpfiddle.org/main/pre/mj68-1s7e



