递归添加二进制数

时间:2010-06-07 08:51:12

标签: algorithm

我需要以下算法 假设我们有5 // 101和7 // 111数字是任意的我需要使用递归方法添加这些数字并同时使用按位方法   结果应该是

101
+
111
 110 0 

或12可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

我相信你正在寻找的东西是这样的:

static int add(int num1, int num2) {
    if (num1 == 0 && num2 == 0) {
        return 0;
    } else {
        return (num1 & 1) + (num2 & 1)
            + (add(num1 >>> 1, num2 >>> 1) << 1);
    }
}
public static void main(String[] args) {
    System.out.println(add(5, 7));   // prints "12"
    System.out.println(add(-3, -4)); // prints "-7"
}

这适用于:

  • 添加num1 num2(num1 & 1) + (num2 & 1)
    • add(num1 >>> 1, num2 >>> 1)
  • 然后以递归方式添加剩余的位,并进行适当的移位
    • add
      • 调用>>>,数字向右移动
      • << 1无符号右移在这里很重要!
    • 然后将结果移回左侧0

我们在两个数字都是+时停止(最终会在足够的无符号右移后发生)。

Carries会自动处理,并且可以使用底片。

那就是说,这并不是选择学习递归的最佳算法。


绝对没有+解决方案

这个解决方案对于学习目的来说更复杂,但它是递归的,它不使用static int add(int num1, int num2, int carry) { if (num1 == 0 && num2 == 0) { return carry; } else { int lsb1 = (num1 & 1); int lsb2 = (num2 & 1); int thisBit = lsb1 ^ lsb2 ^ carry; int nextCarry = (lsb1 == 0 && lsb2 == 1 && carry == 1) || (lsb1 == 1 && lsb2 == 0 && carry == 1) || (lsb1 == 1 && lsb2 == 1 && carry == 0) || (lsb1 == 1 && lsb2 == 1 && carry == 1) ? 1 : 0; return thisBit | (add(num1 >>> 1, num2 >>> 1, nextCarry) << 1); } } public static void main(String[] args) { System.out.println(add(5, 7, 0)); // prints "12" System.out.println(add(-3, -4, 0)); // prints "-7" }

{{1}}

另见

答案 1 :(得分:2)

在伪代码中:

bint a, b, result;
// from back to front
bit carry = 0;
for(ix = 0; ix < sizeof(bint); ix++) {
    result[ix] = a[ix] ^ b[ix] ^ carry;
    carry = (carry & (a[ix] | b[ix])) | (a[ix] & b[ix]);
}

答案 2 :(得分:1)

总是有经典的“按位操作,尽可能少地递归”:

int add (int a , int b)
{
   if (a&b) { /* At least one bit in common */
      return add(a^b, (a&b) << 1); /* Return addition of "no-carry" and "carry" bits */
   } else { /* No bits in common */
      return a|b;
   }
}

我认为,这将导致最少数量的递归调用。