【剑指offer-Java版】47不用加减乘除做加法

来源:互联网 发布:电缆选型软件 编辑:程序博客网 时间:2024/06/08 18:16

不用 + - * / 做加法
输入两个整数,不使用四则运算求出这两个数的和
分析加法运算对应的位运算:
1 等价于两个数先做异或运算 – 相当于不考虑进位的加法
2 然后按位与运算并将与运算的和左移一位 – 相当于考虑进位
3 将1中的结果赋值给第一个数,将2中的结果赋值给第二个数
4 如果第二个数不为0,重复1 2 3

    public class _Q47<T> {    // 不用四则运算 求两个数的和    public int Add(int num1, int num2){        int sum = 0;        int carry = 0;        do{            sum = num1 ^ num2;            carry = (num1 & num2)<<1;            num1 = sum;            num2 = carry;        }while(carry != 0);        return num1;    }    }

测试代码:

    public class _Q47Test extends TestCase {    _Q47<?> add = new _Q47();    public void test() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{        int num1 = 5;        int num2 = 17;        System.out.println(add.Add(num1, num2));        num1 = 0;        num2 = 0;        System.out.println(add.Add(num1, num2));        num1 = -5;        num2 = -17;        System.out.println(add.Add(num1, num2));        num1 = -5;        num2 = 17;        System.out.println(add.Add(num1, num2));        num1 = -5;        num2 = 0;        System.out.println(add.Add(num1, num2));        System.out.println(add.Add(Integer.MIN_VALUE, Integer.MAX_VALUE));    }    }
1 0