2012-05-14 8 views
1

누군가가 나를 도울 수 있기를 바랍니다.두 개의 음수의 비트 합

저는 두 개의 양수 또는 양수와 음수가있는 경우 모두 작동하는 다음 알고리즘을 사용합니다. 그러나 두 숫자가 모두 음수이면 작동하지 않습니다.

누군가 내가 어떻게 설명 할 수 있습니까? 모든 사람에게 사전에

void sum (int p, int q) { 

int sum, carry; 

carry = 1; 

while (carry > 0) { 
    sum = p^q; 
    carry = p & q; 
    carry = carry << 1; 
    p = sum; 
    q = carry; 
} 

p = p << 1; 
p = p >> 1; 

printf("The result equals to %d", p); 

} 

감사합니다 :)

+1

숙제와 같은 소리 – Guillaume

+3

왼쪽으로 시프트하는 음수는 정의되지 않은 동작입니다. 귀하의 코드는 오버플로가 아닌 음수가 아닌 합계에 대한 의미론 만 정의했습니다. –

답변

5

이 음수의 합이 음수 (오버 플로우가 발생하지 않는 한 댓글에서 지적). 그러나이 코드 :

p = p << 1; 
p = p >> 1; 

은 본질적으로 즉 부호 비트, 최상위 비트를 클리어되기 때문에 이것의 결과는 음수가 될하지 않습니다.

+0

오버플로를 고려하면 C++에서 음수의 합이 항상 음수는 아닙니다. – Vlad

+0

나는 수표를 추가하려고 시도했다. 두 숫자가 모두 음수이면 해당 코드는 실행되지 않아야하지만 작동하지 않는다. 그게 어떻게 가능해? – wiredmark

+0

if (p> 0 || q> 0) { p = p << 1; p = p >> 1; } – wiredmark