位运算中 溢出的问题?? 高手请进 $i=17179869182;$j=8589934592;如何求$i&$j;呢??结果应该是8589934592但是由于大于了32位 产生溢出结果为0 php是如何解决这样的问题吗???高手帮忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 实在不行的花 可否象java中转换成long型虽然有bug但暂时这样用了 你可以用 "BC math 高精度数学函数 "(见手册) 我看了可是好像没有位&运算 我就说个思路吧,使用“BC math”把超大数转2进制的字符串,截取该字符串到小数范围,将各个数‘&’运算,得到字符串,再转换为数字,试试吧! 给你写了前半部分,后半部分你自己写吧,呵呵!$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;结果:11111111111111111111111111111111101000000000000000000000000000000000显然结果是8589934592 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); // truesafeBitCheck(17,2); // falsesafeBitCheck((4294967296+8589934592),4294967296); // truesafeBitCheck(2,8589934592); // false $a=17179869182; $b=8589934592; var_dump(decbin($a&$b)); 由于使用内部的 "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); 结果:10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 (即 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';这样既为逆序。 文件管理 php在Linux下怎么搭建环境啊? 截取网址的疑问 高分求,我的Apache2设置问题,只能建立一个虚拟路径www.opms.com,再建一个www.test.com就不行,请高手指教一下 怎么将两个段代码 合成一个函数 初用apache+PHP 如何设置cookie的存储路径(在线等) 如何用php实现简体to繁体的转换,急! 请问各位老大有没有好点的相册程序啊?? 现抱怨一下,在请大家帮忙!! 编程乱码问题初步探索(分享) 请问各位高手PHP中的->这个符号是代表什么意思啊??
$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
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
$b=8589934592;
var_dump(decbin($a&$b));
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';这样既为逆序。