2016-11-20 5 views
0

は、+または - を使用せずに2つの整数を加算します。+または - を使用しないバイナリ整数の追加

これは私のソリューションです。

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; 
    } 
}; 

しかし、それはケースに動作しない場合= -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のどちらかが負の....そして、あなたの例では、両方を持っている場合、これらの懸念はa & bような表現と一緒に家にヒット。 a << 1は、aが負の場合に同様の懸念を示します。

問題を解消するには、unsignedの値(ビット演算子の動作が明確に定義されている)を使用する必要があります。負の値を処理する必要がある場合は、別の方法(たとえば、boolの別の変数)で標識を追跡するだけです。

実際には、ビット補間演算は、2進数表現のsignedタイプでは期待通りに機能します。しかし、それに頼っている問題は、実装がそのような表現を使用する必要がないということです。

関連する問題