2016-02-29 81 views
6

this後,最近收到upvotes的一些顯着的一堆,詢問有關C.
+操作它顯示了以下實現:這個完整的加法器實現是否正確?

// replaces the + operator 
int add(int x, int y) { 
    while(x) { 
     int t = (x & y) <<1; 
     y ^= x; 
     x = t; 
    } 
    return y; 
} 

巧合的是,我寫了一個實現自己太(一算法書練習),並提出了:

uint32_t bit_add(uint16_t a, uint16_t b) { 
    uint32_t carry = ((uint32_t) a & b) << 1; 
    uint16_t add = a^b; 

    return carry^add; 
} 

我測試了幾次,它似乎工作。事情是,它比引用的文章中的實現快得多,在x86上沒有任何跳轉。

我的執行是正確的還是有什麼問題我不知道?
我無法想象我的代碼比經常看到和審查的帖子的代碼更快。

+0

我沒有檢查,但它可能是正確的。不要認爲人們總是可能寫出最有效的代碼;所有這些答案主要是爲玩具問題或演示目的而創建的,而不是實際使用(+仍然更快)。 – Cubic

+0

這兩個例子是不同的,第一個在循環中每個指令運行一位,在你的所有位都受到影響。編譯器也可能已經優化了你的代碼。 – purplepsycho

+0

嘗試添加3和7,它輸出2. – Kenney

回答

6

您的功能不起作用。

一個簡單的反例是127 + 1.

這很容易看出。 127號將所有最少的7位設置爲1. And用數字1表示,並將它向左移一位,將給出數值2.從此開始,使用運算符xor,沒有可用的值的組合,可以產生大於127的值。

+0

廢話,你說得對。你能解釋爲什麼嗎?我已經準備好開始調試了,但是一個解釋會給出一個更好的答案,IMO ...... – Downvoter

+0

@cad你正確地計算了你的'add'和'carry',但是在'return'語句中你犯了一個錯誤!那就是你需要**循環的地方** – Lrrr

+0

@cad查看更新。 – 2501