$i=17179869182;
$j=8589934592;
如何求$i&$j;呢??
结果应该是8589934592
但是由于大于了32位 产生溢出结果为0 php是如何解决这样的问题吗???
高手帮忙

解决方案 »

  1.   

    实在不行的花 可否象java中转换成long型虽然有bug但暂时这样用了
      

  2.   

    你可以用 "BC   math   高精度数学函数 "(见手册) 
      

  3.   

    我看了可是好像没有位&运算
      

  4.   

    我就说个思路吧,使用“BC math”把超大数转2进制的字符串,截取该字符串到小数范围,将各个数‘&’运算,得到字符串,再转换为数字,试试吧!
      

  5.   

    给你写了前半部分,后半部分你自己写吧,呵呵!
    $i = 17179869182; 
    $j = 8589934592;function changeBinStr($num, &$bin)
    {
    $tmp = explode('.', bcdiv($num, 2, 1));

    if($tmp[1] > 0)
    $bin = '1'.$bin;
    else
    $bin = '0'.$bin;

    if($tmp[0] > 0)
    changeBinStr($tmp[0], $bin);
    }$bin = null;
    changeBinStr($i, $bin);
    echo $bin."<br>";$bin = null;
    changeBinStr($j, $bin);
    echo $bin;结果:
    1111111111111111111111111111111110
    1000000000000000000000000000000000
    显然结果是
    8589934592 
      

  6.   

    function safeBitCheck($number,$comparison) {
        if( $number < 2147483647 ) {
            return ($number & $comparison)==$comparison;   
        } else {
            $binNumber = strrev(base_convert($number,10,2));
            $binComparison = strrev(base_convert($comparison,10,2));
            for( $i=0; $i<strlen($binComparison); $i++ ) {
                if( strlen($binNumber)<$i || ($binComparison{$i}==="1" && $binNumber{$i}==="0") ) {
                    return false;   
                }
            }
            return true;
        }
    }safeBitCheck(17,16); // true
    safeBitCheck(17,2); // false
    safeBitCheck((4294967296+8589934592),4294967296); // true
    safeBitCheck(2,8589934592); // false 
      

  7.   

    $a=17179869182; 
    $b=8589934592; 
    var_dump(decbin($a&$b));   
      

  8.   

    由于使用内部的 "double" 或 "float" 类型,base_convert() 的操作可能会导致大数值中的精度丢失。(见手册)BC math 高精度数学函数
    PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述。(见手册)也就是说我的方法可以得到任意精的,而且可以得到最后结果,呵呵测试:
    $j = bcpow('2', '100', 0);$bin = null;
    changeBinStr($j, $bin);
    echo $bin.'<br>'.strlen($bin).'<br>';echo base_convert($j, 10, 2); 结果:
    1000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000
    101 (即 2的100次方)
    而使用base_convert的输出
    1111111111111111000000000000000000000000000000000000000000000000显然我的方法没错
    其实为方便计算可以将changeBinStr函数中
    if($tmp[1] > 0)
            $bin = '1'.$bin;
        else
            $bin = '0'.$bin;
    更换为    if($tmp[1] > 0)
            $bin .= '1';
        else
            $bin .= '0';这样既为逆序。