剑指Offer-65:不用加减乘除做加法

题目

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。

思路

对数字做运算,除了四则运算外,只剩下位运算了。根据一般情况下的加法步骤,设计如下:

1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作;

2)计算进位:只有1加1产生进位,所以采用位与&操作,再左移1位;

3)将和与进位相加,即重复前两步操作。结束判断为进位为0。

public class AddTwoNumbers {
    public int add(int num1,int num2) {
        while(num2!=0){
            int sum=num1^num2;  //没进位的和
            int carry=(num1&num2)<<1;  //进位
            num1=sum;
            num2=carry;
        }
        return num1;
    }
}

扩展:不使用新的变量,交换两个原有变量的值

法一:

    //不使用新的变量,交换两个原有变量的值
    public void swaps(int m, int n) {
    	n = m ^ n;
    	m = n ^ m;
    	n = n ^ m;
    	System.out.println("m:" + m + "; n:" + n);
    }

法二:

public static void main(String[] args){
        //基于加减法
        int a = 3;
        int b = 5;
        a = a + b;
        b = a - b;
        a = a - b;
        System.out.println("a="+a+",b="+b);

        //基于异或法
        a = 3;
        b = 5;
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("a="+a+",b="+b);
    }

猜你喜欢

转载自blog.csdn.net/qq_32534441/article/details/89253238
今日推荐