Per ottenere il resto basta fare l' and tra i due numeri e shiftarlo a sinistra di uno (carry).
Per ottenere invece la somma senza resto basta fare lo xor tra i due numeri (sum).
Ora basta sommare la somma senza resti al carry.
Il problema è che anche quest' ultima somma potrebbe avere resti, per cui:
-Se ci sono resti si chiama ricorsivamente la add;
-Se non ci sono resti si ritorna sum|carry.

codice:
int add(int op1,int op2)
{
    int carry=((op1&op2)<<1);
    int sum=(op1^op2);
    if(!(sum&carry))
        return sum|carry;
    else
        return add(sum,carry);
}