这个全加器实现是否正确?
Is this full adder implementation correct?
有 this post,最近收到了一些非常好的赞成票,询问 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;
}
我测试了几次,似乎有效。事实是,它比引用的 post 的实现要快得多,在 x86 上没有任何跳转。
我的实现是正确的还是有什么我不知道的错误?
我无法想象我的代码比经常看到和评论的 post 的代码更快。
您的功能不起作用。
一个简单的反例是 127 + 1。
这个很容易看出来。数字 127 的所有最低有效位 7 位都设置为 1。And
将其与数字 1 进行运算,并将其向左移动一位,将给出值 2。从那时起,使用运算符 xor
,我们没有可用的值组合可以产生大于 127 的值。
有 this post,最近收到了一些非常好的赞成票,询问 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;
}
我测试了几次,似乎有效。事实是,它比引用的 post 的实现要快得多,在 x86 上没有任何跳转。
我的实现是正确的还是有什么我不知道的错误?
我无法想象我的代码比经常看到和评论的 post 的代码更快。
您的功能不起作用。
一个简单的反例是 127 + 1。
这个很容易看出来。数字 127 的所有最低有效位 7 位都设置为 1。And
将其与数字 1 进行运算,并将其向左移动一位,将给出值 2。从那时起,使用运算符 xor
,我们没有可用的值组合可以产生大于 127 的值。