2011-03-11 3 views
6

과제에서 일하고 있으며이를 구현하는 방법을 알 수 없습니다. 나는 sadd (int x, int y) 함수를 만들어야한다. sadd (int x, int y)는 오버플로하지 않는 한 함께 더해진 숫자를 반환한다. 나는 캐스팅과 조건문을 포함하는 몇 가지 솔루션을 생각해 낼 수 있었지만 솔루션에서는 허용되지 않았다. ~ 연산자 만!^+ < < >> & 및 |.C (HW)의 비트 포화 추가

+2

숙제 질문하기는 괜찮지 만 숙제로 태그를 지정해야합니다. –

+3

시도해보고 올리는 내용을 게시하십시오. (Brian이 말했듯이, HW 질문은 괜찮지 만 최선을주고 코드를 게시하는 것이 더 좋습니다.) – John

+0

'if' /'else'가 없으면 이것은 해커가 될 것입니다 .. –

답변

6

부호가있는 숫자를 추가 할 경우 두 개의 동일한 기호를 추가하고 다른 기호로 결과를 얻으면 오버플로가 발생했습니다. 범위가 있기 때문에 서로 다른 두 개의 숫자를 추가 할 때 오버플로를 생성하는 것은 불가능합니다.

그래서 할 수있는 일은 부호 비트 (2의 보수 중 가장 중요한 것)를 보는 것입니다. 배타적 논리합을 사용하여 원래의 두 숫자가 부호가 다른지 여부를 확인하고 보완하면됩니다. 동일하지 않은 경우 '0', 다른 경우 '1'.

그런 다음 하나의 결과 대 하나의 결과에 대해 배타적 논리합을 사용할 수 있습니다. 동일하다면 '0', 다를 경우 '1'을 줄 것입니다.

이 두 결과는 두 입력이 동일하지만 결과가 다를 경우 전반적인 '1'을 얻고, 그렇지 않은 경우 '0'을 얻습니다.

그런 다음 Shift 및 OR 조합을 사용하여 해당 값으로 전체 정수를 채울 수 있습니다. 32 비트 정수라고 가정하면 가장 낮은 값의 31 비트를 설정하여 가장 큰 양의 정수를 얻습니다. 그런 다음 입력 중 하나의 부호 비트에 대한 유사한 시프트 및 OR 집합을 사용할 수 있습니다. 독점적 인 또는 결과. 입력 값이 음수이면 정수 값이 가장 낮습니다.

EDIT : 오, 오버플로가 있었는지 여부를 비트 값을 사용하여 int 채우기 위해 어떤 값을 선택하여 오버플로가있을 경우 반환 할 결과를 anding하여 그것을 보완하고 anding 그 결과를 정상적인 가산 결과와 함께 두 개의 oring (or 추가)합니다.

Presto : 모든 이진 논리, 조건 없음. 나는 숙제이기 때문에 실제 코드를 원하지 않는다고 가정합니다.

+0

이 코드는 작성했습니다. 숙제 질문에 전체 출제 답변을 추가하는 것이 적절한 지 확신하지 못합니다. 내가 준 설명이 충분히 명확한가요? – Tommy

+1

아마도 그렇지는 않지만, 당신의 솔루션이 취할 수있는 길이를 암시 할 수 있습니다 (MIPS 명령어 세트라고 가정). 우리는 코드 골프를 할 수 있습니다 ;-) – smci