添加两个数字而不使用+或任何算术运算符

时间:2015-10-05 22:44:59

标签: java algorithm

这是我得到的参考实现,令人困惑的是,我认为不需要递归。我在这里发布了代码和我的想法,任何见解都表示赞赏。如果我错了,请随时纠正我。

BTW,关于两个实现差异,请参阅第5行。感谢。

问题是,是否需要递归?感谢。

参考实施,

1 int add_no_arithm(int a, int b) {
2 if (b == 0) return a;
3 int sum = a ^ b; // add without carrying
4 int carry = (a & b) << 1; // carry, but don’t add
5 return add_no_arithm(sum, carry); // recurse
6 }

我想到的另一个实现,

1 int add_no_arithm(int a, int b) {
2 if (b == 0) return a;
3 int sum = a ^ b; // add without carrying
4 int carry = (a & b) << 1; // carry, but don’t add
5 return sum ^ carry;
6 }

BTW,在Python中尝试了8 + 8为我工作,

a = 8
b = 8
sum = a ^ b
carry = (a & b) << 1

print sum^carry #16
提前谢谢, 林

3 个答案:

答案 0 :(得分:3)

第二种方法不适用于1 + 3

以下是步骤

                 a == 01
                 b == 11
         sum = a^b == 10
carry = (a&b) << 1 == 10
       sum ^ carry == 00  // wrong answer! 1 + 3 == 4

仅仅在最后一步做^是不够的,因为这笔钱可能会有进位。

答案 1 :(得分:2)

  

问题是,是否需要递归?

是的,确实如此。您可以通过尝试其他数字而不是仅仅8 + 8来自己看到这一点。例如,尝试21和15,没有递归,这会给出26的输出。

答案 2 :(得分:1)

如果没有二进制携带总和,则按位XOR运算符^仅等效于加法运算符+。如果有二进制携带,则它们不等同。例如,8 + 7等于8 ^ 7等于15,但8 + 8168 ^ 80

即使你已经正确计算了sum-no-carry和carry-no-sum,如果加上这两个数字会产生二进制进位怎么办?然后,最后的^运算符将不正确。如果没有+运算符,我看到的唯一选项就是递归,添加这些数字。这将重复出现,直到其中一个数字为0。

示例:

add(no_arithm(18, 6))
  1. sum = a^b 18 ^ 6是20
  2. carry = (a & b) << 1 18&amp; 6是2,左移位1是4
  3. return sum ^ carry 20 ^ 4是16,不正确(18 + 6 = 24)。