2011-03-11 19 views
6

Pracuję nad zadaniem i nie mogę wymyślić, jak to zaimplementować. Muszę wykonać funkcję sadd (int x, int y), która zwraca liczby dodane razem, chyba że przepełni się (następnie po prostu zwróć maksymalną możliwą liczbę int). Mogłem wymyślić kilka rozwiązań dotyczących castingu i instrukcji warunkowych, ale nie są one dozwolone w rozwiązaniu. Tylko operatorzy ~!^+ < < >> & i |.Bitowe nasycone dodawanie w C (HW)

+2

Zadawanie pytań o pracę domową jest w porządku, ale powinieneś oznaczyć je jako zadanie domowe. –

+3

Spróbuj i napisz, co wymyślisz. (Jak powiedział Brian, pytania HW są w porządku, ale lepiej jest dać z siebie najlepsze ujęcie i opublikować swój kod.) Witaj w SO!) – John

+0

Bez 'if' /' else', to będzie hacky .. –

Odpowiedz

6

W przypadku dodawania podpisanych liczb wystąpiło przepełnienie, jeśli dodano dwie liczby tego samego znaku i otrzymano wynik z innym znakiem. Ze względu na zakresy nie można wygenerować przepełnienia podczas dodawania dwóch liczb różnych znaków.

Więc, co możesz zrobić - obserwując tylko bit znaku (najbardziej znaczący w uzupełnieniu do dwóch) - użyj jedynego OR, aby sprawdzić, czy dwie pierwotne cyfry różnią się znakiem, dopełnij to, abyś miał "0", jeśli były inne, "1" to samo.

Następnie można użyć wykluczającego LUB na wynik w porównaniu do jednego z wejść. To da "0", jeśli są takie same, "1", jeśli są inne.

I te dwa wyniki razem, aby uzyskać ogólny "1", jeśli dwa wejścia były takie same, ale wynik był inny, "0" w przeciwnym razie.

Następnie można użyć kombinacji przesunięć i OR, aby wypełnić całą liczbę całkowitą o tej wartości. Przypuśćmy, że jesteś 32-bitową liczbą całkowitą, ustaw tylko najniższe 31 bitów, aby uzyskać najwyższą wartość dodatnią. Co możesz wtedy zrobić, to podobne zbiory przesunięć i OR na bicie znaku któregokolwiek z wejść. Ekskluzywne wyniki OR. To da zamiast tego najniższą wartość całkowitą, jeśli wartości wejściowe były ujemne.

EDYTOWANIE: oh, i użyj wartości bitu, czy było przepełnienie, rozszerzone, aby wypełnić int, aby wybrać wartość do zwrócenia przez anding to z wynikiem, który powróciłbyś, gdyby było przepełnienie, uzupełnienie go i anding to z normalnym wynikiem dodatkowym, a następnie oring (lub dodanie) dwóch razem.

Presto: cała logika binarna, brak warunków. Zakładam, że ponieważ to praca domowa, nie chcesz prawdziwego kodu?

+0

Mam to zakodowane; nie wiesz, czy warto dodać pełną odpowiedź źródłową na pytanie o pracę domową. Czy wyjaśnienie, które podałem, jest wystarczająco jasne? – Tommy

+1

Prawdopodobnie nie, ale wskazuj mu długość instrukcji, które przyjmuje twoje rozwiązanie (zakładając zestaw instrukcji MIPS). Możemy grać w code-golf ;-) – smci