劍指Offer面試題47(Java版):不用加減乘除做加法

來源:互聯網
上載者:User

標籤:

題目:寫一個函數,求兩個整數之和,要求在函數體內不得適用+,-,* ,./  四則運算子號

面試的時候被問道這個問題,首先我們分析人們是如何進行十進位的加法的,比如是如何得出5+17=22的結果的,實際上,我們可以分三步進行:第一步只做各位相加不進位,此時相加的結果是12,第二步做進位,5+7中有進位,進位的值為10;第三步,把前面的兩個結果加起來12+10的結果是22,剛好5+17=22

我們一直在想,求兩個樹之和四則運算都不能用,還能用什嗎?對數字做運算,除了四則運算之外,也就只剩下位元運算了。位元運算是針對二進位的,我們就以二進位再來分析一下前面的三步走的策略對二進位是不是也適用。

5的二進位是101,17的二進位是10001,還是試著把計算分成三步:第一步各位相加但不計進位,得到的結果是10100;第二步記下進位。在這個例子中只在最後一位相加時產生進位,結果是二進位的10,第三步把前兩步的結果相加,得到的結果是10110,轉換成十進位剛好是22,由此可見三步走的策略對二進位也是適用的。

接下來我們試著把二進位的加法用位元運算來替換。第一步不考慮進位對每一位相加。0+0,1+1的結果都是0,1+0的結果是1。0+1的結果是1,我們注意到這和異或的結果是一樣的。對異或而言,0和0,1和1異或的結果是0,而0和1,1和0的結果異或我i1,接著考慮第二步進位,對0+0,0+1,1+0而言,都不會產生進位,只有1+1時,會向前差生一個進位。此時我們可以想象成是兩個數先做位元運算,然後再向前左移動一位。只有兩個數都是1的時候。第三步相加的過程是重複前面的兩步,直到不產生進位為止。

把這個過程想清楚之後,寫出代碼非常簡介。如下:

/** * 不用加減乘除做加法 */package swordForOffer;/** * @author JInShuangQi * * 2015年8月11日 */public class E47AddTwoNumbers {public int add(int num1,int num2){int sum,carry;do{sum = num1 ^ num2;carry = (num1&num2) <<1;num1 = sum;num2 = carry;}while(num2!=0);return num1;}public static void main(String[] args){E47AddTwoNumbers test = new E47AddTwoNumbers();System.out.println(test.add(5, 17));}}


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

劍指Offer面試題47(Java版):不用加減乘除做加法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.