给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
/**
* @param String $a
* @param String $b
* @return String
*/
//需要注意的点在于PHP处理数字过大会导致变成科学计数法
//对较大的数字需要使用高精度计算函数计算
//未使用php自带转换函数 base_convert()
function addBinary($a, $b) {
$number_a = '0';
$number_b = '0';
//2进制的写法为
//111 就是 2的2次方+2的1次方+2的0次方
//110 就是 2的2次方+2的1次方
//根据二进制的特点将二进制数字转化为十进制
for($i=0;$i<strlen($a);$i++)
{
if($a[$i] == 0)
{
continue;
}
$number_a = bcadd($number_a,number_format(pow(2,(strlen($a)-$i-1)),0,'',''));
}
for($j=0;$j<strlen($b);$j++)
{
if($b[$j] == 0)
{
continue;
}
$number_b = bcadd($number_b,number_format(pow(2,(strlen($b)-$j-1)),0,'',''));
}
$sum = bcadd($number_a,$number_b);
//利用逆推方式先求出数字的log2,然后进行倒叙相减
for ($i=intval(log($sum,2));$i>=0;$i--)
{
if( bcsub($sum,number_format(pow(2,$i),0,'','') ) > 0)
{
$array[$i] = 1;
$sum = bcsub($sum,number_format(pow(2,$i),0,'','') );
}
elseif( bcsub($sum,number_format(pow(2,$i),0,'','') ) == 0)
{
$array[$i] = 1;
$sum = bcsub($sum,number_format(pow(2,$i),0,'','') );
}
else
{
$array[$i] = 0;
}
}
return !empty($array)?implode($array):'0';
}