2012-01-30 9 views
15

Я знаю, что мы можем использовать логику двоичного сумматора, где Sum = а XOR б и Носите = а и б я также получил решение:Добавление двух чисел без оператора + (Осветление)

int add(int a, int b) 
{ 
    if(b == 0) 
     return sum; 
    sum = a^b; 
    carry = (a & b) << 1; 
    return add(sum,carry); 
} 

Я не понимаю здесь, почему бит переноса сдвинут или умножен на 2 во время каждой рекурсии?

+0

У вашего кода есть проблемы, например сумма и перенос не определены. Я предполагаю, что они являются глобальными. –

+0

Да, сумма и перенос - это глобальные. Извини за это. – noMAD

ответ

37

Я нахожу это немного сложным, чтобы объяснить, но вот попытка; понемногу добавляйте, есть только 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 могут быть регулярными локальными переменными.

1
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;  
    } 
} 
0

Привет, не считайте себя слишком сложным. Вот простой способ сделать это.

Consider a=5, b=10; c=a-(-b); c=15;

что это.

Смежные вопросы