Skip to content
Related Articles

Related Articles

Improve Article

Add two unsigned numbers using bits

  • Last Updated : 25 May, 2021
Geek Week

Given two unsigned integers (maximum possible input can be of 32 bits). The task is to add two numbers using bit operations. 

Examples:  

Input: n1 = 12, n2 = 34
Output: 46

Input: n1 = 12564 n2 = -1
Output: 12563 

Approach: Since we know that in bit addition  

  • 1+0=1
  • 0+1=1
  • 0+0=0
  • 1+1=0 carry 1
  • if(carry==1) 1+1=1 carry 1

Represent integer using bitset function in C++ . It behaves like an array which stores the LSB (Least Significant Bit) at 0th index and when we print such an array it prints the binary representation in reverse format. Add every bit from right according to the bits addition property and store in the third bitset. Function to_ulong() is used to convert a bitset form into its decimal form.
Below is the implementation of the above approach. 
 

C++




#include <bits/stdc++.h>
#define M 32
using namespace std;
 
// Function to add two bitset
int binAdd(bitset<M> atemp, bitset<M> btemp)
{
    // To store the bits of answer
    bitset<M> ctemp;
    for (int i = 0; i < M; i++)
        ctemp[i] = 0;
 
    // Initialize carry to 0
    int carry = 0;
 
    for (int i = 0; i < M; i++) {
 
        // Both bits are zero
        if (atemp[i] + btemp[i] == 0) {
 
            if (carry == 0)
                ctemp[i] = 0;
 
            else {
                ctemp[i] = 1;
                carry = 0;
            }
        }
 
        // Any of the one bit is 1
        else if (atemp[i] + btemp[i] == 1) {
 
            if (carry == 0)
                ctemp[i] = 1;
            else {
                ctemp[i] = 0;
            }
        }
 
        // Both bits are 1
        else {
            if (carry == 0) {
                ctemp[i] = 0;
                carry = 1;
            }
            else {
                ctemp[i] = 1;
            }
        }
    }
 
    // To convert bitset into
    // decimal equivalent
    return ctemp.to_ulong();
}
 
// Driver Code
int main()
{
    int number1, number2;
    number1 = 12;
    number2 = 34;
 
    // Converting number 1 to bitset form
    bitset<M> num1(number1);
 
    // Converting number 2 to bitset form
    bitset<M> num2(number2);
 
    cout << binAdd(num1, num2) << endl;
}

Java




// Java program to add two unsigned numbers using bits
 
import java.util.*; // Needed for BitSet class.
 
class GFG {
    static final int M = 32;
 
    // Function to add two BitSets. Returns long number.
    static long binAdd(BitSet atemp, BitSet btemp)
    {
        // Initialize a 3rd BitSet to store the answer.
        BitSet ctemp = new BitSet(M);
        for (int i = 0; i < M; i++) {
            ctemp.set(i, false);
        }
 
        // Initialize carry to ZERO.
        int carry = 0;
 
        for (int i = 0; i < M; i++) {
 
            // Both of the bits are ZERO.
            if (atemp.get(i) == false
                && // Uses the "conditional-AND" operator
                   // (also known as "short-circuit AND")
                   // which is more efficient than the
                   // ordinary & bitwise operator.
                btemp.get(i) == false) {
 
                if (carry == 0) {
                    ctemp.set(i, false);
                }
                else {
                    ctemp.set(i, true);
                    carry = 0;
                }
            }
 
            // Either of the bits is a ONE but not both.
            else if (atemp.get(i) == true
                     ^ // Uses the "XOR" (exclusive-OR)
                       // operator to ensure that ONLY
                       // one of the two bits is a ONE.
                     btemp.get(i) == true) {
 
                if (carry == 0) {
                    ctemp.set(i, true);
                }
                else {
                    ctemp.set(i, false);
                }
            }
 
            // Both of the bits are ONE.
            else // By process of elimination we do not need
                 // to code for the (TRUE & TRUE) condition.
            {
                if (carry == 0) {
                    ctemp.set(i, false);
                    carry = 1;
                }
                else {
                    ctemp.set(i, true);
                }
            }
        }
 
        // Returns the 3rd BitSet as its decimal equivalent
        // number in long format.
        return ctemp.toLongArray()[0];
    }
 
    // Driver Code
    public static void main(String args[])
    {
        int number1, number2;
 
        // binary literal for decimal 15.
        number1 = 15;
        // binary literal for decimal 85.
        number2 = 1;
        // result should be decimal 100.
 
        // Converting number1 to BitSet form.
        BitSet num1
            = BitSet.valueOf(new long[] { number1 });
 
        // Converting number2 to BitSet form.
        BitSet num2
            = BitSet.valueOf(new long[] { number2 });
 
        System.out.printf("%d plus %d equals %d", number1,
                          number2, binAdd(num1, num2));
        System.out.println();
    }
}
 
// This code is contributed by Arnab Kundu.
// Modified by Matt Ambrose.

Python3




# Python3 implementation of the approach
 
# Function to convert given Integer
# to list of bits of length M
def bitset(num):
     
    return [int(x) for x in format(num, '032b')]
     
# Function to add two bitset
def binAdd(atemp, btemp):
 
    # To store the bits of answer
    ctemp = [0] * M
     
    # Initialize carry to 0
    carry = 0
    for i in range(0, M):
 
        # Both bits are zero
        if atemp[i] + btemp[i] == 0:
 
            if carry == 0:
                ctemp[i] = 0
 
            else:
                ctemp[i] = 1
                carry = 0
             
        # Any of the one bit is 1
        elif atemp[i] + btemp[i] == 1:
 
            if carry == 0:
                ctemp[i] = 1
            else:
                ctemp[i] = 0
 
        # Both bits are 1
        else:
            if carry == 0:
                ctemp[i] = 0
                carry = 1
             
            else:
                ctemp[i] = 1
             
    # To convert bitset into string and then
    # convert string to its decimal equivalent
    temp = ''.join([str(x) for x in ctemp])
    return int(temp, 2)
     
# Driver Code
if __name__ == "__main__":
 
    number1, number2 = 12, 34
    M = 32
     
    # Converting number 1 to bitset form
    num1 = bitset(number1)
 
    # Converting number 2 to bitset form
    num2 = bitset(number2)
 
    print(binAdd(num1, num2))
     
# This code is contributed by Rituraj Jain
Output
46
Want to learn from the best curated videos and practice problems, check out the C++ Foundation Course for Basic to Advanced C++ and C++ STL Course for foundation plus STL.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.



My Personal Notes arrow_drop_up
Recommended Articles
Page :