2010-04-15 119 views
4

我可以知道我该怎么办PHP >>>?这些运算符在PHP中不可用,但可以使用Javascript。PHP等效javascript >>>右移零填充按位运算符?

我好不容易才发现的功能如下:

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

但不幸的是,它并不完美。

EG:-1149025787 >>> 0 的Javascript返回3145941509 PHP ZEROFILL()返回0

+2

你能描述什么不顺心呢? – Cam 2010-04-15 01:07:55

+1

我想你已经看过:http://php.net/manual/en/language.operators.bitwise.php – 2010-04-15 01:20:17

+0

@incrediment: 在近百个结果中只有1个是不正确的: -1149025787 >>> 0 在JavaScript返回3145941509 ,但在zeroFill()上面,它只是返回0. – neobie 2010-04-15 02:12:53

回答

0

我研究周围的网,并推出了自己的ZEROFILL功能,底座上给出的解释。这种方法适用于我的程序。

看一看:

function zeroFill($a,$b) { 
    if ($a >= 0) { 
     return bindec(decbin($a>>$b)); //simply right shift for positive number 
    } 

    $bin = decbin($a>>$b); 

    $bin = substr($bin, $b); // zero fill on the left side 

    $o = bindec($bin); 
    return $o; 
} 
1

您的功能不起作用,因为当$b == 0,表达

$a >> -1 

将被评估,返回0。

假设32位机器,您可以添加特殊情况:

if ($z & $a) { 
    if ($b == 0) 
    return $a + 0x100000000; 
    else { 
    ... 
1

不知道这是否适用于PHP,我设法让它与C#一起工作。

int a, b, result; 
//Instead of 
result = a >>> b; 
//I do 
result = (int)((uint)a >> b); 

我发现,通过从调试到使用>>>它与I从JavaScript转换的代码的C#版本进行比较的代码。尝试使用b = 0,并使用科学计算器查看由javascript生成的>>>>>的不同十六进制/十进制结果。当a为负数时,>>>实际上使aa为无符号。

不知道是否适用于所有情况,但对于我的情况>>>是为md5散列。能够产生类似的输出,我对结果非常满意。

希望帮助

0

这对我的作品

function RRR($a, $b){ 
    return (int)((float)$a/pow(2,(int)$b)); 
} 
2

两倍快负数为使用十进制二进制转换

function zerofill($a,$b) { 
    if($a>=0) return $a>>$b; 
    if($b==0) return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1); 
    return ((~$a)>>$b)^(0x7fffffff>>($b-1)); 
1

对于32位(PHP_INT_SIZE = = 4)和64位整数(PHP_INT_SIZE == 8):

function SHR 
($x, $c) 
{ 
    $x = intval ($x); // Because 13.5 >> 0 returns 13. We follow. 

    $nmaxBits = PHP_INT_SIZE * 8; 
    $c %= $nmaxBits; 

    if ($c) 
     return $x >> $c & ~ (-1 << $nmaxBits - $c); 
    else 
     return $x; 
} 
1

我已经研究了很多,从StackOverflow和开源项目收集了超过11个版本,他们都没有工作。但最后,我找到了解决方案。

有关详细信息,现场演示,测试和实施例检查我的问题和回答:
Unsigned Right Shift/Zero-fill Right Shift in PHP (Java/JavaScript equivalent)

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 &= 2147483647; 
     $a |= 0x40000000; 
     $a = ($a >> ($b - 1)); 
    } else { 
     $a = ($a >> $b); 
    } 

    return $a; 
}