【问题标题】:How do I perform a proper unsigned right shift in PHP?如何在 PHP 中执行正确的无符号右移?
【发布时间】:2014-10-17 06:31:43
【问题描述】:

这可能在 PHP 和 Javascript 中得到相同的结果吗?

例子:

Javascript

<script>

function urshift(a, b)
{
  return a >>> b;
}

document.write(urshift(10,3)+"<br />");
document.write(urshift(-10,3)+"<br />");
document.write(urshift(33, 33)+"<br />");
document.write(urshift(-10, -30)+"<br />");
document.write(urshift(-14, 5)+"<br />");

</script>

输出:

1
536870910
16
1073741821
134217727

PHP

function uRShift($a, $b) 
    { 
        if ($a < 0) 
        { 
            $a = ($a >> 1); 
            $a &= 2147483647; 
            $a |= 0x40000000; 
            $a = ($a >> ($b - 1)); 
        } else { 
            $a = ($a >> $b); 
        } 
        return $a; 
    }

echo uRShift(10,3)."<br />";
echo uRShift(-10,3)."<br />";
echo uRShift(33,33)."<br />";
echo uRShift(-10,-30)."<br />";
echo uRShift(-14,5)."<br />";

输出:

1
536870910
0
0
134217727

这样可以得到同样的结果吗?

最接近我想要的功能在这里:

Unsigned right shift function not working for negative input

感谢您的帮助。

【问题讨论】:

标签: javascript php bit-shift unsigned-integer


【解决方案1】:

试试这个功能:

function unsigned_shift_right($value, $steps) {
    if ($steps == 0) {
         return $value;
    }

    return ($value >> $steps) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($steps - 1));
}

输出,基于您的代码示例:

1
536870910
16
1073741821
134217727

【讨论】:

  • PHP 给了我结果:1 2305843009213693950 0 1073741823 576460752303423487 为什么?
【解决方案2】:

最后我想我找到了解决方案,我不知道为什么,但这段代码对我有用:

function uRShift($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; 
    }

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2019-06-25
    • 2013-01-03
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多