經常看到類似”不使用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
*/