经常看到类似”不使用XXX符号的前提下,实现加、减、乘、除“?第一次遇见的同学可能会懵,如果你记起来一个叫位运算的东西就会豁然开朗了。
算法概述
加法:比如5+6。小学的时候数学老师告诉我们的是,先求不算进位的值,也就是1,然后再将进位结果(这里是1)加入,直到进位为0。使用位运算也是同样的道理。只不过我们对于进位和不进位的结果的产生感到陌生而已。
位运算中两个数相加的不进位结果:a^b,进位结果a&b;之后取a&b左移一位后的结果和a^b相加,如此一直加下去,直到进位为0,此时就能得到结果。
减法:减法其实也是属于加法,因为a-b=a+(-b);于是首先需要将b取相反数,位运算中只要将b位取反后加上1即可,b=~b加1。
乘法:乘法就是多次的加法而已,这里不再累述。
除法:就是多次的减法,直到被除数小于等于0。
代码示例
public class Solution3 {
public int add(int a, int b) {
int sum = a;
int arr = b;// 表示进位
while (arr != 0) {
sum = a ^ b;
arr = (a & b) << 1;
a = sum;
b = arr;
}
return sum;
}
public int minus(int a, int b) {
// b为减数,先变成负数
b = add(~b, 1);
return add(a, b);
}
public int multi(int a, int b) {
// b为乘数
for (int i = 0; i < b - 1; i++) {
a = add(a, a);
}
return a;
}
public int divide(int dividend, int divisor) {
// a被除树,b为除数
int a = dividend;
int b = divisor;
if(a==1)
return 0;
if(b==0)
try {
throw new Exception("被除数不能为0!");
} catch (Exception e) {
e.printStackTrace();
return 0;
}
int result = 0;
if (a > 0 && b > 0) {
while (a > 0) {
a = minus(a, b);
if (a >= 0)
result++;
}
return result;
} else if (a < 0 && b > 0) {
a = add(~a, 1);
return add(~divide(a, b), 1);// 结果变为负号
} else if (a > 0 && b < 0) {
b = add(~b, 1);
return add(~divide(a, b), 1);
} else if (a < 0 && b < 0) {
a = add(~a, 1);
b = add(~b, 1);
return divide(a, b);
}
return result;
}
public static void main(String[] args) {
Solution3 solution3 = new Solution3();
System.out.println(solution3.add(2, 3));
System.out.println(solution3.minus(15, 3));
System.out.println(solution3.multi(5, 2));
System.out.println(solution3.divide(15,3));
}
}
/*
输出:
5
12
10
5
*/