不使用加减乘除做加法
题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
1.位运算
解题思路:
1.1 一位运算
异或运算: 加法运算:
1 ^ 1 = 0; 1 + 1 = 0; 产生进位
0 ^ 0 = 0; 0 + 0 = 0;
1 ^ 0 = 1; 1 + 0 = 1;
0 ^ 1 = 1; 0 + 1 = 1;
对于一位加法,异或运算等同于加法运算。
在位运算中使用 “<<”左移表示向左进一位。我们使用此来表示进位。
所以通过异或来实现加法,左移实现进位。
(a ^ b)
(a & b) << 1
1.2 二位运算
正确的加法运算:
11 + 01 = 100
套用上方的方法:
第一步:
11 ^ 01 = 10;
11 & 01 = 01;
01 << 1 =010;
第二步:循环一次
10 ^ 010 = 000;
10 & 010 = 010;
010 << 1 = 100;
当进位为0时,也就是没有进位时,停止循环,得到最终的结果。
1.3 三位运算
循环三次,得到最终的结果。
代码实现:递归版本,通过对数器验证。
package test1;
public class Test1 {
public static int Add(int num1,int num2) {
if(num2 == 0){
return num1;
}
int sum = num1^num2;
int carry = (num1&num2)<<1;
return Add(sum,carry);
}
public static int makeValue(int value){
int num = (int)((value) *Math.random());
return num;
}
public static void main(String[] args) {
int loop = 500000;
int value = 100;
boolean flag = true;
for(int i = 0;i< loop; i++){
int num1 = makeValue(value);
int num2 = makeValue(value);
int sumValue = Add(num1,num2);
if((num1+num2)!= sumValue){
System.out.println(num1 + " " + num2);
System.out.println(sumValue);
flag = false;
break;
}
}
System.out.println(flag ? "Nice" : "Fucking");
}
}