6

そのため、私の方法を使用して PHP で ( >>> ) 符号なし右シフトを実行すると、数値に負の値が含まれていると結果が正しくありません。

PHP アプリケーションの結果:

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

Java アプリケーションの結果:

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

(上の結果は正しく、Java によって生成されたものであり、下の結果は正しくなく、PHP によって生成されたものです)

失敗するのは、PHP で数値が負の場合のみです。

これらのアプリケーションで使用されているシフトは次のとおりです。

できれば助けてください!

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

2 に答える 2

12

このuRShiftはより短く、32ビットおよび64ビットのPHPで正しく機能し、Javaと同じサイズのintを持つ32ビットPHPの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
于 2013-01-20T19:39:50.097 に答える
3

代わりにこの機能を試してください。

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; 
}  
于 2013-01-20T19:29:12.923 に答える