面试题65:不用加减乘除做加法
题目要求:
写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。
解题思路:
不能用四则运算,那只能通过位运算了。其实四则运算是针对十进制,位运算是针对二进制,都能用于运算。下面以0011(即3)与0101(即5)相加为例说明
1.两数进行异或: 0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合
2.两数进行与: 0011&0101=0001 这个数字为1的位置表示需要进位,而进位动作是需要向前一位进位
3.左移一位: 0001<<1=0010
此时我们就完成0011 + 0101 = 0110 + 0010的转换
如此转换下去,直到其中一个数字为0时,另一个数字就是原来的两个数字的和
代码实现如下
package chapter6;
/**
* Created with IntelliJ IDEA
* Author: ryder
* Date : 2017/8/20
* Time : 21:03
* Description:不用加减乘除做加法
**/
public class P310_AddTwoNumbers {
public static int add(int a,int b){
int sum = a^b;
int carry = (a&b)<<1;
int temp;
while (carry!=0){
temp = sum;
sum = sum^carry;
carry = (carry&temp)<<1;
}
return sum;
}
public static void main(String[] args){
System.out.println(add(3,5)); //8
System.out.println(add(3,-5)); //-2
System.out.println(add(0,1)); //1
}
}
运行结果
8
-2
1