使用PHP计算32位系统上的按位64位运算

时间:2014-01-08 00:04:29

标签: php algorithm bit-manipulation bitwise-operators

我有一系列存储在数据库中的二进制数的基本10表示。例如:

686316060672

现在我编写了一些简单的代码来从中提取位:

$code = 686316060672;

for($n = 0; $n < 64; $n++)
{
    $r = pow(2,$n);

    if(($code  & $r) > 0)
    {
        printf('n=%d'."\n", $n);
    }
}

现在我知道这个二进制数大于32位,因此我得不到我期望的结果。

上面的代码告诉我:

n=21 n=23 n=24 n=25 n=27 n=30

当我知道答案应该是:

n=21 n=23 n=24 n=25 n=27 n=30 n=31 n=32 n=33 n=34 n=35 n=36 n=39

它似乎是一个32位操作系统问题,但似乎无法解决如何将$code值拆分为两个32位段。

这是我试过的:

$number =  base_convert($code, 10, 2);
$lsb = bindec(substr($number, -32));
$msb = bindec(substr_replace($number, '', -33));

然后我将$code替换为$lsb$msb

有人可以指向正确的方向,这样我就可以获得n的所有值。

1 个答案:

答案 0 :(得分:1)

所以在仔细研究之后......我正在以错误的方式看问题。以下是我如何解决问题。

$x = 686316060672;
$y = 2;


for($n = 1; $n < 65; $n++){
$x = floor($x / $y); 
if($x % 2){
printf('n=%d'."\n", $n);
}// end if

}// end for

这给出了:

n=21 n=23 n=24 n=25 n=27 n=30 n=31 n=32 n=33 n=34 n=35 n=36 n=39