这个全加器实现是否正确?

cad*_*luk 6 c algorithm add

这篇文章,最近收到了一些非常好的赞成票,询问了+C中的运营商.
它显示了以下实现:

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

巧合的是,我自己也写了一个实现(算法书练习),并提出了:

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;
}
Run Code Online (Sandbox Code Playgroud)

我测试了几次它似乎工作.事实上,它比参考帖子的实现快得多,缺少x86上的任何跳转.

我的实施是正确的还是有什么不对的我不知道?
我无法想象我的代码比经常看到和审查的帖子的代码更快.

250*_*501 6

你的功能不起作用.

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

这很容易看到.数字127都有明显的7位设置为1. And使用数字1,并将其向左移一,将给出值2.从那时起,使用运算符xor,我们没有可用的值的组合,可以产生一个大于127的值.