Добавление двух чисел без оператора + (уточнение)
Я знаю, что мы можем использовать логику двоичного сумматора, где Sum = a XOR b и Carry = a AND b
У меня также есть решение:
int add(int a, int b)
{
if(b == 0)
return sum;
sum = a ^ b;
carry = (a & b) << 1;
return add(sum,carry);
}
Я не понимаю здесь, почему бит переноса сдвинут или умножен на 2 во время каждой рекурсии?
Ответы
Ответ 1
Мне кажется, это немного сложно объяснить, но вот попытка; понемногу добавляйте, есть только 4 случая;
0+0=0
0+1=1
1+0=1
1+1=0 (and generates carry)
Две строки обрабатывают разные случаи
sum = a ^ b
Обрабатывает регистр 0 + 1 и 1 + 0, сумма будет содержать простой случай, все позиции бит, которые составляют до 1.
carry = (a & b) << 1
Часть (a и b) находит все позиции битов в случае 1 + 1. Так как добавление приводит к 0, это важное значение, и оно смещается в следующую позицию влево (< 1). Перемещение должно быть добавлено в эту позицию, поэтому алгоритм запускается снова.
Алгоритм повторяется до тех пор, пока не будет больше переносов, и в этом случае сумма будет содержать правильный результат.
Btw, return sum
должно быть return a
, тогда как sum
, так и carry
могут быть регулярными локальными переменными.
Ответ 2
public class AddSub {
int sum=0,carry=0;
public static void main(String[] args) {
System.out.println("Add "+new AddSub().addition(93,5));
System.out.println("Sub "+new AddSub().subtraction(7,60));
System.out.println("Sub "+new AddSub().multiplication(9,60));
}
public int addition(int a, int b)
{
if(b==0)
{
return a;
}
else
{
sum = a^b;
carry = (a&b)<<1;
return addition(sum,carry);
}
}
public int subtraction(int a, int b){
return addition(a,addition(~b,1));
}
public int multiplication(int a, int b){
for(int i=0;i<b/2;i++)
sum = addition(sum,addition(a,a));
return sum;
}
}
Ответ 3
Привет, не думайте, что вы слишком сложны.
Вот простой способ сделать это.
Consider a=5, b=10;
c=a-(-b);
c=15;
вот и все.