给你两个二进制字符串,返回它们的和(用二进制表示)(PHP)

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 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';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值