这个完整的加法器实现是否正确?

问题描述:

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

您的功能不起作用。

一个简单的反例是127 + 1.

这很容易看出。 127号将所有最少的7位设置为1. And用数字1表示,并将它向左移一位,将给出数值2.从此开始,使用运算符xor,没有可用的值的组合,可以产生大于127的值。

+0

废话,你说得对。你能解释为什么吗?我已经准备好开始调试了,但是一个解释会给出一个更好的答案,IMO ...... – Downvoter

+0

@cad你正确地计算了你的'add'和'carry',但是在'return'语句中你犯了一个错误!那就是你需要**循环的地方** – Lrrr

+0

@cad查看更新。 – 2501