《剑指offer》-求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号

/*
 * 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
 * 思路:不能使用四则运算,就只剩下位运算了。例如17+5
 * 17转化成二进制10001,5转化成二进制0101。
 * 首先不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0
 * 可以看出这是位^运算(异或),这一步的结果是10100.
 * 
 * 接下来考虑是否产生进位,则1+1=1,0+1=0,1+0=0,0+0=0
 * 可以看出这是位&运算(与),这一步的结果是00001,
 * 考虑进位要加在前面一位上,所以将结果左移00010
 * 
 * 最后10100^00010=10110,转化为十进制为22
 * 注:与&、非~、或|、异或^
 */
public class Add {
	public int add(int num1,int num2) { 
		
		while(num2 != 0) {	//迭代终止条件:进位为0
			
			//不考虑进位
	        int temp1 = num1 ^ num2;
	        
	        //获取进位
	        int temp2 = (num1 & num2) << 1;
	        
	        num1 = temp1;
	        num2 = temp2;
		}
        
        return num1;
    }
	
	public static void main(String[] args) {
		System.out.println(new Add().add(5, 17));
	}
}

点赞