Add two unsigned numbers using bits - GeeksforGeeks

25 May, 2021
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++
Java
Python3
#include <bits/stdc++.h>#define M 32using namespace std; // Function to add two bitsetint 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 Codeint 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 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 implementation of the approach # Function to convert given Integer# to list of bits of length Mdef bitset(num):         return [int(x) for x in format(num, '032b')]     # Function to add two bitsetdef 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 Codeif __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
46

andrew1234
rituraj_jain
mambroseavc
BIT
CPP-bitset
C++
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Inheritance in C++
C++ Classes and Objects
Virtual Function in C++
Bitwise Operators in C/C++
Constructors in C++
Operator Overloading in C++
Templates in C++ with Examples
Socket Programming in C/C++
Polymorphism in C++
Object Oriented Programming in C++