我需要以下算法 假设我们有5 // 101和7 // 111数字是任意的我需要使用递归方法添加这些数字并同时使用按位方法 结果应该是
101
+
111
110 0
或12可以帮助我吗?
答案 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;
}
}
我认为,这将导致最少数量的递归调用。