我正在寻找一种在PHP 5.5.14的64位版本中使用JavaScript的>>>
函数的方法。我在谷歌上找到了这个函数:
function uRShift($a, $b)
{
$z = hexdec(80000000);
if ($z & $a)
{
$a = ($a >> 1);
$a &= (~$z);
$a |= 0x40000000;
$a = ($a >> ($b - 1));
} else {
$a = ($a >> $b);
}
return $a;
}
这个函数似乎对正数工作得很好,但是当传入负数时,我得到不同的结果。
例如:PHP:In: echo uRShift(-672461345, 25);
Out: -149
JavaScript (Chrome 35):
In: -672461345 >>> 25
Out: 107
编辑:我还尝试了上面链接的答案中提到的其他功能。
function uRShift($a, $b)
{
if($b == 0) return $a;
return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1));
}
PHP: In: echo uRShift(-672461345, 25);
Out: 549755813867
Runnable
常数0x80000000
(在本例中,它被写成对hexdec
的调用并存储在$z
变量中)表示最低符号二补负整数(二进制100000....
)。表达式~$z
应该给出它的按位NOT,即最高的有符号正整数(最终为2147483647
)。
原始数(正 确实,在runnable中回显0x80000000
,即2147483648
)不能存储为有符号 32位整数,因此通常将其存储为某种浮点数。不幸的是,PHP 5.5认为~(2147483648)
等于-2147483649
,如果我们处理64位整数, 将是正确的。PHP_INT_SIZE
表示整数是8字节,即64位。因此,在PHP 5.5中,算术不能正确地工作。~$z
替换为静态常量,如下所示:
function uRShift($a, $b)
{
if ($a < 0)
{
$a = ($a >> 1);
$a &= 2147483647;
$a |= 0x40000000;
$a = ($a >> ($b - 1));
} else {
$a = ($a >> $b);
}
return $a;
}
这个函数仍然有一些弱点;例如,移位0不能正常工作。