C++: Converting Hexadecimal to Decimal

前端 未结 7 1697
一向
一向 2020-11-30 11:49

I\'m looking for a way to convert hex(hexadecimal) to dec(decimal) easily. I found an easy way to do this like :



        
相关标签:
7条回答
  • 2020-11-30 11:57

    Well, the C way might be something like ...

    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    {
            int n;
            scanf("%d", &n);
            printf("%X", n);
    
            exit(0);
    }
    
    0 讨论(0)
  • 2020-11-30 11:57

    I use this:

    template <typename T>
    bool fromHex(const std::string& hexValue, T& result)
    {
        std::stringstream ss;
        ss << std::hex << hexValue;
        ss >> result;
    
        return !ss.fail();
    }
    
    0 讨论(0)
  • 2020-11-30 12:03

    Here is a solution using strings and converting it to decimal with ASCII tables:

    #include <iostream>
    #include <string>
    #include "math.h"
    using namespace std;
    unsigned long hex2dec(string hex)
    {
        unsigned long result = 0;
        for (int i=0; i<hex.length(); i++) {
            if (hex[i]>=48 && hex[i]<=57)
            {
                result += (hex[i]-48)*pow(16,hex.length()-i-1);
            } else if (hex[i]>=65 && hex[i]<=70) {
                result += (hex[i]-55)*pow(16,hex.length( )-i-1);
            } else if (hex[i]>=97 && hex[i]<=102) {
                result += (hex[i]-87)*pow(16,hex.length()-i-1);
            }
        }
        return result;
    }
    
    int main(int argc, const char * argv[]) {
        string hex_str;
        cin >> hex_str;
        cout << hex2dec(hex_str) << endl;
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-30 12:03

    This should work as well.

    #include <ctype.h>
    #include <string.h>
    
    template<typename T = unsigned int>
    T Hex2Int(const char* const Hexstr, bool* Overflow)
    {
        if (!Hexstr)
            return false;
        if (Overflow)
            *Overflow = false;
    
        auto between = [](char val, char c1, char c2) { return val >= c1 && val <= c2; };
        size_t len = strlen(Hexstr);
        T result = 0;
    
        for (size_t i = 0, offset = sizeof(T) << 3; i < len && (int)offset > 0; i++)
        {
            if (between(Hexstr[i], '0', '9'))
                result = result << 4 ^ Hexstr[i] - '0';
            else if (between(tolower(Hexstr[i]), 'a', 'f'))
                result = result << 4 ^ tolower(Hexstr[i]) - ('a' - 10); // Remove the decimal part;
            offset -= 4;
        }
        if (((len + ((len % 2) != 0)) << 2) > (sizeof(T) << 3) && Overflow)
            *Overflow = true;
        return result;
    }
    

    The 'Overflow' parameter is optional, so you can leave it NULL.

    Example:

    auto result = Hex2Int("C0ffee", NULL);
    auto result2 = Hex2Int<long>("DeadC0ffe", NULL);
    
    0 讨论(0)
  • 2020-11-30 12:10

    Use std::hex manipulator:

    #include <iostream>
    #include <iomanip>
    
    int main()
    {
        int x;
        std::cin >> std::hex >> x;
        std::cout << x << std::endl;
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-30 12:11
        std::cout << "Enter decimal number: " ;
        std::cin >> input ;
    
        std::cout << "0x" << std::hex << input << '\n' ;
    

    if your adding a input that can be a boolean or float or int it will be passed back in the int main function call...

    With function templates, based on argument types, C generates separate functions to handle each type of call appropriately. All function template definitions begin with the keyword template followed by arguments enclosed in angle brackets < and >. A single formal parameter T is used for the type of data to be tested.

    Consider the following program where the user is asked to enter an integer and then a float, each uses the square function to determine the square. With function templates, based on argument types, C generates separate functions to handle each type of call appropriately. All function template definitions begin with the keyword template followed by arguments enclosed in angle brackets < and >. A single formal parameter T is used for the type of data to be tested.

    Consider the following program where the user is asked to enter an integer and then a float, each uses the square function to determine the square.

    #include <iostream>
     using namespace std;
    template <class T>      // function template
    T square(T);    /* returns a value of type T and accepts                  type T     (int or float or whatever) */
      void main()
    {
    int x, y;
    float w, z;
    cout << "Enter a integer:  ";
    cin >> x;
    y = square(x);
    cout << "The square of that number is:  " << y << endl;
    cout << "Enter a float:  ";
    cin >> w;
    z = square(w);
    cout << "The square of that number is:  " << z << endl;
    }
    
    template <class T>      // function template
    T square(T u) //accepts a parameter u of type T (int or float)
    {
    return u * u;
    }
    
    Here is the output:
    
    Enter a integer:  5
    The square of that number is:  25
    Enter a float:  5.3
    The square of that number is:  28.09
    
    0 讨论(0)
提交回复
热议问题