leetcode-371-Sum of Two Integers
阿新 • • 發佈:2018-04-17
判斷 特殊 而且 tor 完成 很多 bmi else if 優化
題目描述:
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example:
Given a = 1 and b = 2, return 3.
要完成的函數:
int getSum(int a, int b)
說明:
1、這道題目其實要實現二進制的加法,我們可以用異或實現,十分簡單。
代碼如下:
int getSum(int a, int b)
{
int a1,b1,res1,result=0;
bool addflag=0;
for(int i=0;i<32;i++)
{
a1=a&1;//取出最低位
b1=b&1;//取出最低位
res1=a1^b1^addflag;//用異或計算加完的結果
if(a1==0&&b1==0)//判斷addflag
addflag=0;
else if(a1==0&&b1==1&&addflag==0)
addflag =0;
else if(a1==0&&b1==1&&addflag==1)
addflag=1;
else if(a1==1&&b1==0&&addflag==0)
addflag=0;
else if(a1==1&&b1==0&&addflag==1)
addflag=1;
else
addflag =1;
result+=(res1<<i);
a>>=1;//a不斷向右移動一位(二進制)
b>>=1;//b不斷向右移動一位(二進制)
}
return result;
}
異或就是二進制的王道運算方法。
上述代碼實測3ms,有很多人實現了2ms的做法,看來還有優化的空間。
2、上述代碼中比較費時間的也就是大堆的if else語句了。
其實我們要判斷的是如下條件:
a1 | b1 | 上個addflag | 新的addflag |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
有沒有覺得很熟悉,出現了1個1,結果是0,出現了2個1,結果是1。
我們可以用異或來更加快速地處理。
至於全是0和全是1的情況,就特殊處理好了。
代碼如下:
int getSum(int a, int b)
{
int a1,b1,res1,result=0;
bool addflag=0;
for(int i=0;i<32;i++)
{
a1=a&1;
b1=b&1;
res1=a1^b1^addflag;
if(a1==1&&b1==1&&addflag==1)
addflag=1;
else if(a1==0&&b1==0&&addflag==0)
addflag=0;
else
addflag=!(a1^b1^addflag);
result+=(res1<<i);
a>>=1;
b>>=1;
}
return result;
}
上述代碼實測2ms,beats 100% of cpp submissions。
3、比較1中和2中代碼,為什麽異或做的條件判斷可以比if else語句更省時間?
因為if else語句要不斷嘗試,這個if不滿足,那就再嘗試else if,如果再不滿足,就再嘗試下一個else if,不斷地嘗試過程浪費了一些時間。
而且嘗試過程是a1跟0,b1跟0,addflag跟0這些值在比較,比較過程其實也就是相減,看會不會最終結果為0。所以其實還是在做運算。
異或的做法直接就是三個值做異或運算,一次搞定,所以肯定比if else語句快。
leetcode-371-Sum of Two Integers