2011-03-11 46 views
6

我正在做一個任務,我無法弄清楚如何實現這個。我必須做一個函數sadd(int x,int y),它返回加起來的數字,除非它溢出(然後只返回最大可能的int)。我已經能夠提出一些涉及鑄造和條件語句的解決方案,但解決方案中不允許這些解決方案。只有運營商〜!^+ < < >> &和|。C中的按位飽和加法(HW)

+2

問作業問題沒問題,但你應該標記他們作爲家庭作業。 –

+3

試一試,發佈你想出的東西。 (正如Brian所說,硬件問題沒有問題,但最好是給它一個最好的鏡頭併發布你的代碼,歡迎來到SO!) – John

+0

沒有'if' /'else',這會變得怪異.. –

回答

6

對於有符號數的添加,如果您添加兩個相同符號的數字並獲得不同符號的結果,則會發生溢出。由於涉及的範圍,添加兩個不同符號數量時不可能產生溢出。

所以,你可以做的是 - 僅觀察符號位(二進制補碼中最重要的位) - 使用異或來判斷兩個原始數字是否在符號上不同,補充,以便你有'0'如果不同,'1'相同。

然後,您可以對結果與其中一個輸入使用「異或」。如果它們是相同的,那麼會給出'0',如果它們不同,則會給出'1'。

如果兩個輸入相同但結果不同,則這兩個結果一起得到總體'1',否則爲'0'。

然後,您可以使用位移和OR組合來填充具有該值的整個整數。假設你是一個32位的整數,只需設置最低的31位來獲得最高值的正整數。然後你可以做的是在任何一個輸入的符號位上有一組類似的移位和OR。獨佔OR結果。如果輸入是負數,那麼它會給出最小值的整數。

編輯:哦,並使用是否有溢出的位值,擴展到填充整數,選擇什麼值返回和結果,你會返回,如果有溢出,補充它和anding它與正常的相加結果相同,然後將它們相加(或相加)。

Presto:所有二進制邏輯,無條件。我假設,因爲它是作業,你不需要實際的代碼?

+0

我已經編碼了;不確定在作業問題上添加完整的源代碼答案是否合適。我給出的解釋非常清楚嗎? – Tommy

+1

可能不是,但提示他的解決方案需要的指令長度(假設MIPS指令集)。我們可以玩代碼高爾夫;-) – smci