劍指offer第二版-65.不用加減乘除做加法

本系列導(dǎo)航:劍指offer(第二版)java實現(xiàn)導(dǎo)航帖

面試題65:不用加減乘除做加法

題目要求:
寫一個函數(shù),求兩個正數(shù)之和,要求在函數(shù)體內(nèi)不能使用四則運算符號。

解題思路:
不能用四則運算,那只能通過位運算了。其實四則運算是針對十進(jìn)制,位運算是針對二進(jìn)制,都能用于運算。下面以0011(即3)與0101(即5)相加為例說明

1.兩數(shù)進(jìn)行異或:  0011^0101=0110 這個數(shù)字其實是把原數(shù)中不需進(jìn)位的二進(jìn)制位進(jìn)行了組合
2.兩數(shù)進(jìn)行與:    0011&0101=0001 這個數(shù)字為1的位置表示需要進(jìn)位,而進(jìn)位動作是需要向前一位進(jìn)位
3.左移一位:      0001<<1=0010

此時我們就完成0011 + 0101 = 0110 + 0010的轉(zhuǎn)換

如此轉(zhuǎn)換下去,直到其中一個數(shù)字為0時,另一個數(shù)字就是原來的兩個數(shù)字的和

代碼實現(xiàn)如下

package chapter6;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/20
 * Time  : 21:03
 * Description:不用加減乘除做加法
 **/
public class P310_AddTwoNumbers {
    public static int add(int a,int b){
        int sum = a^b;
        int carry = (a&b)<<1;
        int temp;
        while (carry!=0){
            temp = sum;
            sum = sum^carry;
            carry = (carry&temp)<<1;
        }
        return sum;
    }
    public static void main(String[] args){
        System.out.println(add(3,5)); //8
        System.out.println(add(3,-5)); //-2
        System.out.println(add(0,1));  //1
    }
}

運行結(jié)果

8
-2
1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 劍指 offer 在一個二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成...
    faremax閱讀 2,333評論 0 7
  • ?1 C語言程序的結(jié)構(gòu)認(rèn)識 用一個簡單的c程序例子,介紹c語言的基本構(gòu)成、格式、以及良好的書寫風(fēng)格,使讀者對c語...
    CONLYOUC閱讀 8,885評論 9 66
  • 題目要求:寫一個函數(shù),求兩個整數(shù)之和,要求在函數(shù)體內(nèi)不得使用+、-、*、/四則運算符號。 仔細(xì)一看這題頗有意思,求...
    豆豆先生的小屋閱讀 1,515評論 0 2
  • 謹(jǐn)記: 上帝在締造每個人的時候,給予每個人的一切都是相同的,然而,人與人卻是存在如此大的差距,記著上帝為你關(guān)上了一...
    長風(fēng)留言閱讀 5,748評論 0 5
  • 上闕:夢里花開滿圃,問夜香枝何處?釵鈿蒙塵銅鏡古,女子不再此妝梳。與誰親慕?遠(yuǎn)方畫眉酥。 下闕:秋懶閑靠椅扶,無月...
    木土有阿杜閱讀 223評論 0 0

友情鏈接更多精彩內(nèi)容