寫一個函數,求兩個整數之和,要求不得使用 +、-、*、/ 四則運算符號。java
a ^ b 表示沒有考慮進位的狀況下兩數的和,(a & b) << 1 就是進位。函數
遞歸會終止的緣由是 (a & b) << 1 最右邊會多一個 0,那麼繼續遞歸,進位最右邊的 0 會慢慢增多,最後進位會變爲 0,遞歸終止。spa
public int Add(int a, int b) { return b == 0 ? a : Add(a ^ b, (a & b) << 1); }
第二種方法:
首先看十進制是如何作的: 5+7=12,三步走 第一步:相加各位的值,不算進位,獲得2。 第二步:計算進位值,獲得10. 若是這一步的進位值爲0,那麼第一步獲得的值就是最終結果。 第三步:重複上述兩步,只是相加的值變成上述兩步的獲得的結果2和10,獲得12。 一樣咱們能夠用三步走的方式計算二進制值相加: 5-101,7-111 第一步:相加各位的值,不算進位,獲得010,二進制每位相加就至關於各位作異或操做,101^111。 第二步:計算進位值,獲得1010,至關於各位作與操做獲得101,再向左移一位獲得1010,(101&111)<<1。 第三步重複上述兩步, 各位相加 010^1010=1000,進位值爲100=(010&1010)<<1。 繼續重複上述兩步:1000^100 = 1100,進位值爲0,跳出循環,1100爲最終結果。code
public class Solution { public int Add(int num1,int num2) { while (num2!=0) { int temp = num1^num2; num2 = (num1&num2)<<1; num1 = temp; } return num1; } }