例項4:發散思維能力——不用加減乘除做加法
阿新 • • 發佈:2019-02-10
問題描述:寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。
知識拓展:&:與(x&y)兩二進位制上下比較只有位值都為1時才取1,否則取0。
例如:14&15 (14 二進位制 1110,15 二進位制 1111 ——&與的結果 :1110 ---->結果14)
|:或(x|y)兩二進位制上下比較只有位值都為0時才取0,否則取1。
例如:14|15 (14 二進位制 1110,15 二進位制 1111 ——|或的結果:1111 ---->結果15)
^:異或(x^y)兩二進位制上下比較只有位不相等時才取1,否則取零。
例如:14^15 (14 二進位制 1110,15 二進位制 1111 ——^異或的結果:0001 ---->結果1)
問題分析:第一感覺使用二進位制的位運算。最後寫出來是一個迭代的過程。每次迭代先計算x和y的和但不處理進位,那麼相當於做異或,得到res1;然後處理進位問題,相當於計算與運算,得到res2;那麼res2左移1位,再加到res1上,則整個運算的最終結果轉化為res1+(res2<<1);因為res2做左移,總會減小到0,那時候的res1就是最終結果。
程式碼實現:
public class Solution { public int Add(int num1,int num2) { int sum,mark; do{ sum = num1^num2; mark = (num1&num2)<<1; num1=sum; num2=mark; }while(num2!=0); return num1; } public static void main(String[] args) { Solution solution = new Solution(); int sum = solution.Add(5, 7); System.out.println(sum); } }
執行結果:
12