Leetcode-不用加號的加法

設(shè)計(jì)一個(gè)函數(shù)把兩個(gè)數(shù)字相加。不得使用 + 或者其他算術(shù)運(yùn)算符。

示例:

輸入: a = 1, b = 1
輸出: 2

提示:
a, b 均可能是負(fù)數(shù)或 0
結(jié)果不會溢出 32 位整數(shù)

解題思路

題目中要求不能使用+或者其他運(yùn)算符,所以這題使用位運(yùn)算符來實(shí)現(xiàn)。
普通的整數(shù)相加,如6+5 = 11,因?yàn)槭?0進(jìn)制,所以進(jìn)位1
同理二進(jìn)制也具有這個(gè)規(guī)律,也就是逢二進(jìn)一

在二進(jìn)制位運(yùn)算符中,異或和與運(yùn)算符的規(guī)則如下:
異或^ : 相同則為0,不相同則為1
與& :如果兩個(gè)數(shù)都為1則為1,否則為0

結(jié)合二進(jìn)制逢二進(jìn)一的特性和異或的規(guī)則,我們可以看出兩個(gè)二進(jìn)制進(jìn)行異或的話,會舍去進(jìn)位1,如 0110 ^ 1011 = 1101,第二位向第二位進(jìn)的1被舍去。

被丟棄的進(jìn)位該如何參與到運(yùn)算中?
可以參考運(yùn)算符&,如 0100 & 0101 = 0100,這個(gè)結(jié)果如果向左進(jìn)行帶符號位移的話,恰好能得到進(jìn)位1所在的位置->1000

綜上,結(jié)合上面兩點(diǎn),兩個(gè)整數(shù)a和b相加的話,抽取的數(shù)學(xué)模型如下:
int x = a^b
int y =(a&b)<<1
不斷 x^y , 直到y(tǒng)=0(表示沒有進(jìn)位了)為止。

代碼如下:

class Solution {
    public int add(int a, int b) {

        while(b != 0)
        {
            int sum = a ^ b; //不帶進(jìn)位之和
            int carry = (a & b) << 1;  //進(jìn)位,并且向左進(jìn)一位,如果carry==0,說明沒有進(jìn)位,已經(jīng)得到了結(jié)果,直接退出
            a = sum;
            b = carry;
        }

        return a;

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 關(guān)鍵字 1.1 關(guān)鍵字的概述 Java的關(guān)鍵字對java的編譯器有特殊的意義,他們用來表示一種數(shù)據(jù)類型,或...
    哈哈哎呦喂閱讀 672評論 0 0
  • 運(yùn)算符是處理數(shù)據(jù)的基本方法,用來從現(xiàn)有的值得到新的值。JavaScript 提供了多種運(yùn)算符,本章逐一介紹這些運(yùn)算...
    徵羽kid閱讀 700評論 0 0
  • Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java 技術(shù)具有卓越的通用性、高效性、平臺移植性和...
    Java小辰閱讀 1,119評論 0 2
  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量、屬性、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 901評論 0 2
  • 若給你自由 你會向哪飛翔 丫丫0205 2018-08-13 21:45 · 字?jǐn)?shù) 242 · 閱讀 0 · 日記...
    丫丫0205閱讀 103評論 0 0