有这篇文章,最近收到了一些非常好的赞成票,询问了+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上的任何跳转.
我的实施是正确的还是有什么不对的我不知道?
我无法想象我的代码比经常看到和审查的帖子的代码更快.
你的功能不起作用.
一个简单的反例是127 + 1.
这很容易看到.数字127都有明显的7位设置为1. And使用数字1,并将其向左移一,将给出值2.从那时起,使用运算符xor,我们没有可用的值的组合,可以产生一个大于127的值.