PHP Unsigned Right Shift - Malfunctioning

限于喜欢 提交于 2020-01-13 10:07:29

问题


So, when using my method to preform a ( >>> ) unsigned right shift in PHP, the result is incorrect when the numbers involve negatives.

PHP Application Results:

INPUT: 10 >>> 3
INPUT: -10 >>> 3
OUTPUT: 1
OUTPUT: 2684354558

JAVA APPLICATION RESULTS:

INPUT: 10 >>> 3
INPUT: -10 >>> 3
OUTPUT: 1
OUTPUT: 536870910

(The top results are correct and generated by Java and then the bottom results are incorrect and generated by PHP)

It's only when the number is negative in PHP that it fails.

The shifts being used in those applications is:

Please help if you can!

Method for shifting in PHP:

function urshift($x, $n){
$mask = 0x40000000;
if ($x < 0){
    $x &= 0x7FFFFFFF;
    $mask = $mask >> ($n-1);
    $ret = ($x >> $n) | $mask;
    $ret = str_pad(decbin($ret), 32, '0', STR_PAD_LEFT);
    $ret[0] = '1';
    $ret = bindec($ret);
} else {
        $ret = (int)$x >> (int)$n;
}
return $ret;

回答1:


This uRShift is shorter, works correctly with 32- and 64-bit PHP and gives the same result as the Java version on 32-bit PHP which has same size ints as Java;

function uRShift($a, $b)
{
    if($b == 0) return $a;
    return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1));
}

> uRShift(-10,3)  
536870910

> uRShift(10,3)
1



回答2:


try this function instead.

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; 
}  


来源:https://stackoverflow.com/questions/14428193/php-unsigned-right-shift-malfunctioning

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!