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)
Odpowiedz
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?
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
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
- 1. 8-bitowe wyliczenie, w C
- 2. Przenośne wyświetlacze bitowe w C++?
- 3. C 64-bitowe wyrównywanie wskaźnika
- 4. Nasycone dodanie dwóch podpisanych wartości Javy "długich"
- 5. RC4 128-bitowe szyfrowanie w C#
- 6. Jak powolny są bitowe pola w C++
- 7. C# przesunięcie bitowe na ushort (UInt16)
- 8. Bitowe operacje w OCaml
- 9. bitowe operatorów w PostgreSQL
- 10. 32-bitowe i 64-bitowe obliczenia zmiennoprzecinkowe
- 11. bitowe lub (|) w argumencie funkcji
- 12. C#: Dodawanie podpunktów w ListView
- 13. Dodawanie delegata w języku C#
- 14. Perl bitowe AND i bitowe przesunięcie
- 15. Gdzie instalować mieszane 32-bitowe i 64-bitowe pakiety aplikacji?
- 16. 128-bitowe liczby całkowite obsługujące +, -, *,/i% w kompilatorze Intel C?
- 17. Bitowe ORAZ z funkcją zwracającą bool w C++
- 18. Jak uzyskać dane bitowe od wartości całkowitej w C?
- 19. bitowe OR stałych
- 20. Porównanie bitowe bitów w Javie
- 21. bitowe XOR operator w JavaScript
- 22. Jak wykonać operacje bitowe w glsl
- 23. Dodawanie natury C/C++ do projektu Eclipse
- 24. Co to jest maskowanie bitowe?
- 25. Dodawanie obiektu C++ do klasy Objective-C
- 26. Czy mam Numpy 32-bitowe lub 64-bitowe?
- 27. Python 32-bitowe limity pamięci na 64-bitowe okna
- 28. Czy 32-bitowe i 64-bitowe mogą współpracować ze sobą?
- 29. Dodawanie informacji EXIF do obrazów w C#
- 30. Dodawanie setter do własności wirtualnej w C#
Zadawanie pytań o pracę domową jest w porządku, ale powinieneś oznaczyć je jako zadanie domowe. –
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
Bez 'if' /' else', to będzie hacky .. –