题目:不用加减乘除做加法
写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。
思路:
不能用四则运算,那只能通过位运算了。其实四则运算是针对十进制,位运算是针对二进制,都能用于运算。下面以0011(即3)与0101(即5)相加为例说明
1.两数进行异或: 0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合
2.两数进行与: 0011&0101=0001 这个数字为1的位置表示需要进位,而进位动作是需要向前一位进位
3.左移一位: 0001<<1=0010
此时我们就完成0011 + 0101 = 0110 + 0010的转换
如此转换下去,直到其中一个数字为0时,另一个数字就是原来的两个数字的和
基于以上思路,java参考代码如下:
package chapter6;
public class P310_AddTwoNumbers {
//三步走:第一步,只做各位相加不进位;第二步,做进位;第三布,把前面两个结果加起来(涉及重复前面的步骤)。
public static int add(int num1,int num2){
int sum,carry;
do{
sum=num1^num2;
carry=(num1&num2)<<1;
num1=sum;
num2=carry;
}while (num2!=0);
return num1;
}
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
}
}
测试用例:
a.输入正数、负数和0。
相关问题:
1.不使用新的变量,交换两个变量的值。比如有两个变量a、b,我们希望交换它们的值。有两种不同的方法:基于加减法(a=a+b;b=a-b;b=a-b;);基于异或运算(a=a^b; b=a^b; a=a^b;)。
2.[LeetCode] 2.Add Two Numbers 两个数字相加