我尝试了下面的代码,但我不明白为什么它给了我错误的答案。我在计算2的补码,然后加上另一个“否”。
#include <stdio.h>
int add(int a, int b) {
while (a) {
a = (a & b) << 1;
b = a^b;
}
return b;
}
int sub(int a, int b) // add a with b's 2's complement.
{
return (add(a, add(~b, 1)));
}
int main() {
int a, b, res;
a = 3, b = 1;
res = sub(a, b);
printf("%d\n", res);
return 0;
}
5条答案
按热度按时间zz2j4svz1#
我使用了NullUserException建议的不同的add()函数,它现在可以工作了:
hs1ihplo2#
考虑到负数是如何表示的,下面将计算a - b:
正如OP已经指出的:)这将注意力转移到您的add实现上,这当然是错误的。下面是一个奇怪的方法(因为已经给出了其他更好的方法)
(保持同样的想法,代码可以做得更好,只是太累了,做得更好)
zlhcx6iw3#
你也可以递归地实现它。在C中,这可能看起来像:
ssm49v7z4#
add方法实现不正确。这样做->一个Java的方式。
ogq8wdun5#