2016-11-20 4 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; 
    } 
}; 

그러나이 경우에 작동하지 않는 경우 = -12, B = -8.


다른 사람들의 작업 솔루션을 옆에 그것을 측면을 비교, 그는이 있습니다 bascially 동일

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

합니다. 왜 내 솔루션이 작동하지 않습니까?

+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 << 1a이 음수이면 유사한 문제를 나타냅니다.

문제를 제거하려면 unsigned 값 (비트 연산자에 대해 잘 정의 된 동작)이 필요합니다. 음수 값을 처리해야하는 경우 다른 방법으로 기호를 추적하면됩니다 (예 : bool 유형의 다른 변수).

실제로 비트 연산은 12 진수 표현을 사용하는 signed 유형에 대해 예상대로 작동합니다. 그러나 이것에 의존하는 문제는 그러한 표현을 사용하기 위해 구현할 필요가 없다는 것입니다.