2016-11-20 44 views
0

添加兩個整數。在不使用+或 - 的情況下添加二進制整數而不使用+或 -

這是我的解決方案。

class Solution { 
public: 
    int getSum(int a, int b) { 
     int temp=a & b; 
     a=a^b; 
     while (temp>0){ 
      b=temp<<1; 
      temp=a & b; 
      a=a^b; 
     } 
     return a; 
    } 
}; 

但它不會對案件的工作當a = -12, B = -8。


與其他人的工作方案相比較它並排,他有:

class Solution { 
public: 
    int getSum(int a, int b) { 
     int sum = a; 

     while (b != 0) 
     { 
      sum = a^b;//calculate sum of a and b without thinking the carry 
      b = (a & b) << 1;//calculate the carry 
      a = sum;//add sum(without carry) and carry 
     } 

     return sum; 
    } 
}; 

這是bascially相同。爲什麼我的解決方案不起作用?

+0

因爲你的錯。這些操作的順序和位置非常重要。 –

+0

我知道我錯了。但代碼基本相同 –

+1

,因爲'while(temp> 0)'...如果你有'&'2負數,你會得到另一個負數 – technosaurus

回答

2

嚴格地說既您的解決方案,你與比較一個是不正確的,除非你做出signed整型的表示特定假設。你的不同之處在於操作順序。

的解釋是寫在C標準本身。例如,從2011年的ISO C標準(ISO/IEC 9899:2011)第6.5節,第4

一些運營商(一元運算符〜,和二進制運算符< <,>>,&,^ ,和|,統稱爲按位運算符)應具有整型的操作數。這些運算符返回依賴於整數內部表示的值,因此具有實現定義的和未定義的簽名類型方面。

這些問題與表達式打類似家庭a & b如果任ab爲負....和你的例子兩者兼具。如果a爲負數,則a << 1給出類似的關注。

爲了消除你的問題,你需要unsigned值(該位運算符具有明確定義的行爲)的工作。如果您需要處理負值,只需以另一種方式跟蹤標誌(例如bool類型的另一個變量)。

在實踐中,位運算工作如預期signed類型的二進制補碼錶示。然而,依靠這個問題的問題是不需要實現來使用這種表示。

相關問題