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

时间:2016-02-29 13:07:40

标签: c algorithm add

this帖子,最近收到了一些非常好的赞成票,询问了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上的任何跳转。

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

1 个答案:

答案 0 :(得分:6)

你的功能不起作用。

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

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