不带+运算符添加两个数字(澄清)

时间:2012-01-30 21:22:09

标签: bit-manipulation

我知道我们可以使用二进制加法器的逻辑Sum = a XOR bCarry = a AND b

我也有一个解决方案:

int add(int a, int b)
{
     if(b == 0)
         return sum;
     sum = a ^ b;
     carry = (a & b) << 1;
     return add(sum,carry);
}

这里我不明白为什么在每次递归期间进位位移位或乘以2?

3 个答案:

答案 0 :(得分:43)

我发现这有点难以解释,但这是一次尝试;一点一点地想,只有4个案例;

0+0=0 
0+1=1 
1+0=1 
1+1=0 (and generates carry)

这两行处理不同的情况

sum = a ^ b

处理大小写0 + 1和1 + 0,sum将包含简单大小写,所有位位置加起来为1.

carry = (a & b) << 1

(a&amp; b)部分找到具有情况1 + 1的所有比特位置。由于加法结果为0,因此它是重要的进位,并且它被移动到左边的下一个位置(&lt;&lt; 1)。需要将进位添加到该位置,因此算法再次运行。

算法重复直到不再有进位,在这种情况下,sum将包含正确的结果。

顺便说一下,return sum应为return a,然后sumcarry都可以是常规的局部变量。

答案 1 :(得分:1)

public class AddSub {

    int sum=0,carry=0;
    public static void main(String[] args) {
        System.out.println("Add "+new AddSub().addition(93,5));
        System.out.println("Sub "+new AddSub().subtraction(7,60));
        System.out.println("Sub "+new AddSub().multiplication(9,60));
    }

    public int addition(int a, int b)
    {
        if(b==0)
        {
            return a;
        }
        else
        {
             sum = a^b;
             carry = (a&b)<<1;
            return addition(sum,carry);         
        }
    }

    public int subtraction(int a, int b){

        return addition(a,addition(~b,1));

    }

    public int multiplication(int a, int b){       
        for(int i=0;i<b/2;i++)
            sum = addition(sum,addition(a,a));
        return sum;     
    }
}

答案 2 :(得分:0)

嗨,不要以为自己太难了。 这是一种简单的方法。

Consider a=5, b=10;
c=a-(-b);
c=15;

就是这样。