我正在寻找一种使用方法>>>
64 位版本 PHP 5.5.14 中 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
EDIT:
我还尝试了上面链接的答案中提到的其他功能。
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
应该给出按位非,即最高有符号正整数(最终是2147483647
).
原数(positive 0x80000000
, 那是,2147483648
) 不能存储为signed32 位整数,所以通常它会存储为某种类型的浮点数。不幸的是,PHP 5.5 认为~(2147483648)
等于-2147483649
, which 如果我们正在处理例如,那么这是正确的64 位整数.
确实,回响PHP_INT_SIZE
in runnable表示整数是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 无法正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)