How to add two Hexadecimal numbers

Given two numeric Hexadecimal numbers str1 and str2, the task is to add the two hexadecimal numbers. 

Hexadecimal Number system, often shortened to “hex”, is a number system made up from 16 symbols. it uses 10 symbols from decimal number system which are represented by 0-9 and six extra symbols A – F which represent decimal 10 – 15.

Examples:

Input: str1 = “01B”, str2 = “378”
Output: 393
Explanation:
B (11 in decimal) + 8 =19 (13 in hex), hence addition bit = 3, carry = 1
1 + 7 + 1 (carry) = 9, hence addition bit = 9, carry = 0
0 + 3 + 0 (carry) = 3, hence addition bit = 3, carry = 0
01B + 378 = 393

Input: str1 = “AD”, str2 = “1B”
Output: C8
Explanation:
D(13 in Dec) + B(11 in Dec) = 24(18 in hex), hence addition bit = 8, carry = 1
A(10 in Dec) + 1 + 1 (carry)= 12 (C in hex), addition bit = C carry = 0
AD + 1B = C8  



 

Approach: The idea is to use a map template to store the mapped values that are hexadecimal to decimal and decimal to hexadecimal.

  1. Iterate until one of the given string reaches its length.
  2. Start with carrying zero and add both numbers(with the carry) from the end and update carry in each addition.
  3. Perform the same operation on the remaining length of the other string (if both the strings have different lengths).
  4. Return the value that has been added.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Map for converting hexadecimal
// values to decimal
map<char, int> hex_value_of_dec(void)
{
    // Map the values to decimal values
    map<char, int> m{ { '0', 0 }, { '1', 1 }, 
                      { '2', 2 }, { '3', 3 }, 
                      { '4', 4 }, { '5', 5 }, 
                      { '6', 6 }, { '7', 7 }, 
                      { '8', 8 }, { '9', 9 }, 
                      { 'A', 10 }, { 'B', 11 }, 
                      { 'C', 12 }, { 'D', 13 }, 
                      { 'E', 14 }, { 'F', 15 } };
  
    return m;
}
  
// Map for converting decimal values
// to hexadecimal
map<int, char> dec_value_of_hex(void)
{
    // Map the values to the
    // hexadecimal values
    map<int, char> m{ { 0, '0' }, { 1, '1' }, 
                      { 2, '2' }, { 3, '3' }, 
                      { 4, '4' }, { 5, '5' }, 
                      { 6, '6' }, { 7, '7' }, 
                      { 8, '8' }, { 9, '9' }, 
                      { 10, 'A' }, { 11, 'B' }, 
                      { 12, 'C' }, { 13, 'D' }, 
                      { 14, 'E' }, { 15, 'F' } };
  
    return m;
}
  
// Function to add the two hexadecimal numbers
string Add_Hex(string a, string b)
{
    map<char, int> m = hex_value_of_dec();
    map<int, char> k = dec_value_of_hex();
  
    // Check if length of string first is
    // greater than or equal to string second
    if (a.length() < b.length())
        swap(a, b);
  
    // Store length of both strings
    int l1 = a.length(), l2 = b.length();
  
    string ans = "";
  
    // Initialize carry as zero
    int carry = 0, i, j;
  
    // Traverse till second string
    // get traversal completely
    for (i = l1 - 1, j = l2 - 1;
         j >= 0; i--, j--) {
  
        // Decimal value of element at a[i]
        // Decimal value of element at b[i]
        int sum = m[a[i]] + m[b[j]] + carry;
  
        // Hexadecimal value of sum%16
        // to get addition bit
        int addition_bit = k[sum % 16];
  
        // Add addition_bit to answer
        ans.push_back(addition_bit);
  
        // Update carry
        carry = sum / 16;
    }
  
    // Traverse remaining element
    // of string a
    while (i >= 0) {
  
        // Decimal value of element
        // at a[i]
        int sum = m[a[i]] + carry;
  
        // Hexadecimal value of sum%16
        // to get addition bit
        int addition_bit = k[sum % 16];
  
        // Add addition_bit to answer
        ans.push_back(addition_bit);
  
        // Update carry
        carry = sum / 16;
        i--;
    }
  
    // Check if still carry remains
    if (carry) {
        ans.push_back(k[carry]);
    }
  
    // Reverse the final string
    // for desired output
    reverse(ans.begin(), ans.end());
  
    // Return the answer
    return ans;
}
  
// Driver Code
int main(void)
{
    // Initialize the hexadecimal values
    string str1 = "1B", str2 = "AD";
  
    // Function call
    cout << Add_Hex(str1, str2) << endl;
}

chevron_right


Output:

C8

Time Complexity: O(max(N, M)), where the length of the string first and second is N and M.
Auxiliary Space: O(max(N, M)), where the length of the string first and second is N and M.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.