2011-03-11 37 views
6

Tôi đang làm bài tập và tôi không thể tìm ra cách thực hiện điều này. Tôi phải thực hiện một hàm sadd (int x, int y) trả về các số được cộng lại với nhau trừ khi nó tràn (sau đó chỉ trả lại số int tối đa có thể). Tôi đã có thể đưa ra một số giải pháp liên quan đến các câu lệnh đúc và điều kiện, nhưng những câu lệnh đó không được phép trong giải pháp. Chỉ có các nhà khai thác ~!^+ < < >> & và |.Bổ sung độ bão hòa bitwise trong C (HW)

+2

Đặt câu hỏi về bài tập về nhà là ok, nhưng bạn nên gắn thẻ chúng làm bài tập ở nhà. –

+3

Hãy thử và đăng những gì bạn nghĩ ra. (Như Brian đã nói, HW câu hỏi là tốt nhưng nó tốt hơn để cho nó bắn tốt nhất của bạn và đăng mã của bạn. Chào mừng bạn đến SO!) – John

+0

Nếu không có 'if' /' else', điều này sẽ là hacky .. –

Trả lời

6

Để thêm số đã ký, tràn đã xảy ra nếu bạn thêm hai số cùng một dấu và nhận được kết quả bằng một dấu khác. Do phạm vi liên quan, không thể tạo tràn khi thêm hai số dấu hiệu khác nhau. Vì vậy, những gì bạn có thể làm là - chỉ xem bit dấu (phần quan trọng nhất trong phần bổ sung của hai) - sử dụng OR độc quyền để xem liệu hai số gốc có khác biệt trong dấu, bổ sung để bạn có '0' nếu chúng khác nhau, '1' cho cùng.

Sau đó, bạn có thể sử dụng OR độc quyền trên kết quả so với một trong các yếu tố đầu vào. Điều đó sẽ cho '0' nếu chúng giống nhau, '1' nếu chúng khác nhau.

Và hai kết quả này lại với nhau để có được tổng thể '1' nếu hai yếu tố đầu vào giống nhau nhưng kết quả khác nhau, '0' ngược lại.

Sau đó, bạn có thể sử dụng kết hợp các ca và OR để điền vào toàn bộ số nguyên với giá trị đó. Giả sử bạn đang ở trong một số nguyên 32 bit, chỉ cần đặt 31 bit thấp nhất để có được số nguyên dương có giá trị cao nhất. Những gì bạn có thể làm sau đó là một bộ tương tự các ca và OR trên bit dấu của một trong hai đầu vào. Độc quyền HOẶC kết quả. Điều đó sẽ thay thế cho số nguyên giá trị thấp nhất nếu đầu vào là số âm.

CHỈNH SỬA: oh và sử dụng giá trị bit cho dù có tràn, được mở rộng để điền vào int, để chọn giá trị nào cần trả lại bằng cách thêm và kết quả bạn sẽ trả lại nếu có tràn, bổ sung và tạo nó với kết quả phụ gia bình thường, sau đó oring (hoặc thêm) hai với nhau.

Presto: tất cả logic nhị phân, không có điều kiện. Tôi cho rằng, vì đó là bài tập về nhà, bạn không muốn mã thực sự?

+0

Tôi có mã này; không chắc chắn nếu nó thích hợp để thêm một câu trả lời đầy đủ nguồn về một câu hỏi bài tập về nhà. Lời giải thích tôi đã nói rõ ràng chưa? – Tommy

+1

Có lẽ không, nhưng gợi ý cho anh ta độ dài trong hướng dẫn mà giải pháp của bạn thực hiện (giả sử tập lệnh MIPS). Chúng tôi có thể chơi code-golf ;-) – smci

Các vấn đề liên quan