PHP实现javascript无符号右移
Win10 x64
<?php
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;
}
echo unsignedRightShift(-608900361, 32); // 与 js中的alert(-608900361>>>32)对比
CentOS6.8 x64
<?php
/**
* >>> javascript operator in php x86_64
* @param int $a
* @param int $b
* @return int
*/
function rrr($a, $b)
{
return ($a & 0xFFFFFFFF) >> ($b & 0x1F);
}
/**
* >> javascript operator in php x86_64
* @param int $a
* @param int $b
* @return int
*/
function rr($a, $b)
{
$a = $a & 0x80000000 ? $a | 0xFFFFFFFF00000000 : $a & 0xFFFFFFFF;
return $a >> ($b & 0x1F);
}
/**
* << javascript operator in php x86_64
* @param int $a
* @param int $b
* @return int
*/
function ll($a, $b)
{
$t = ($a & 0xFFFFFFFF) << ($b & 0x1F);
return $t & 0x80000000 ? $t | 0xFFFFFFFF00000000 : $t & 0xFFFFFFFF;
}
不同系统使用不同的代码。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭