Bitwise recursive addition of two integers
When adding two binary numbers by hand we keep the carry bits in mind and add it at the same time. But to do same thing in program we need a lot of checks. Recursive solution can be imagined as addition of carry and a^b (two inputs) until carry becomes 0.
Examples :
Input : int x = 45, y = 45
Output : 90
Input : int x = 4, y = 78
Output : 82
Sum of two bits can be obtained by performing XOR (^) of the two bits. Carry bit can be obtained by performing AND (&) of two bits.
Above is simple Half Adder logic that can be used to add 2 single bits. We can extend this logic for integers. If x and y don’t have set bits at same position(s), then bitwise XOR (^) of x and y gives the sum of x and y. To incorporate common set bits also, bitwise AND (&) is used. Bitwise AND of x and y gives all carry bits. We calculate (x & y) << 1 and add it to x ^ y to get the required result.
One important observation is, if (x & y) becomes 0, then result is x ^ y.
C
#include <stdio.h>
int add( int x, int y) {
int keep = (x & y) << 1;
int res = x^y;
if (keep == 0)
return res;
add(keep, res);
}
int main(){
printf ( "%d" , add(15, 38));
return 0;
}
|
C++
#include <bits/stdc++.h>
using namespace std;
int add( int x, int y) {
int keep = (x & y) << 1;
int res = x^y;
if (keep == 0)
return res;
add(keep, res);
}
int main(){
cout<< add(15, 38);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int add( int x, int y)
{
int keep = (x & y) << 1 ;
int res = x^y;
if (keep == 0 )
return res;
return add(keep, res);
}
public static void main (String[] args)
{
System.out.println(add( 15 , 38 ));
}
}
|
Python3
def add(x, y):
keep = (x & y) << 1 ;
res = x^y;
if (keep = = 0 ):
return res;
return add(keep, res);
print (add( 15 , 38 ));
|
C#
using System;
class GFG {
static int add( int x, int y)
{
int keep = (x & y) << 1;
int res = x^y;
if (keep == 0)
return res;
return add(keep, res);
}
public static void Main ()
{
Console.Write(add(15, 38));
}
}
|
PHP
<?php
function add( $x , $y ) {
$keep = ( $x & $y ) << 1;
$res = $x ^ $y ;
if ( $keep == 0)
{
echo $res ;
exit (0);
}
add( $keep , $res );
}
$k = add(15, 38);
?>
|
Javascript
<script>
function add(x, y)
{
let keep = (x & y) << 1;
let res = x ^ y;
if (keep == 0)
return res;
return add(keep, res);
}
document.write(add(15, 38));
</script>
|
Time Complexity : O(logn)
Auxiliary Space: O(logn)
Last Updated :
31 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...