十六进制(2^n进制)转换十进制(非2^n进制)快速算法

C++代码如下:

算法思路: 使用long long类型来保存较大的十进制数字, \n如果再大就需要用大数字数组加法来计算. 此处使用char *来保存输入的十六进制字符(边输入边存储,所以是倒着存的),\n之后使用快速的位运算而不是快速幂运算.公式为:1>>(2*4*i)\n( 1:binary : 0001 ; 2: bin-> 0010 ,不能被2的N次方搞混)计算当前结果, \n之后相加 OK! 
#include <string>
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;

typedef long long ll;

    /* 
    *   @author Hahn
    *   此算法可在指数为1时减少一步计算(base *= base)
    *
    */

ll pow(ll x, ll y)  //改进版快速幂运算
{
    ll r = 1;
    ll base = x;
    while (y > 0)
    {
        if (y == 1)
        {
            r *= base;
            return r;
        }
        if (y & 1)
            r += base;
        base *= base;
        y >>= 1;
    }
    return r;
}

void input(char * hex)  //倒着存
{
    int index = -1;
    char ch;
    while (ch = getchar())
    {
        if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F')
        {
            hex[++index] = ch;
        }
        else
            break;
    }
    hex[++index] = '\0';
}

int main()
{

    clock_t time_one, time_two;
        char hex[10];
        input(hex);

        /**
        *   res 结果
        *   i 循环计数
        *   via_num , tmp 位运算临时变量
        *   mutli_num  = 1 , 位运算的基数;
        *   而且也不能直接用数字1来计算, 1被认为是int32 而不是ll
        */
        //cout << strlen(hex) - 1 << endl;
        ll res = 0;
        ll i = 0;
        ll via_num;
        ll mutli_num = 1;
        ll sub_num;
        time_one = clock();
        int tmp = 0;
        for (i = strlen(hex) - 1; i >= 0; i--, tmp++)
        {
            if (hex[i] == '0')
                continue;

            switch (hex[i])
            {
            case '1':
            {
                via_num = mutli_num << (4 * tmp);
                res = res + via_num;
                break;
            }
            case '2':
            {
                via_num = 2 *  mutli_num << (4 * tmp);
                res = res + via_num;
                break;
            }
            case '3':
            {
                via_num = 3 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case '4':
            {
                via_num = 4 * mutli_num << (4 * tmp);
                res = res + via_num;
                break;
            }
            case '5':
            {
                via_num = 5 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case '6':
            {
                via_num = 6 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case '7':
            {
                via_num = 7 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case '8':
            {
                via_num = 8* mutli_num << (4 * tmp);
                res = res + via_num;
                break;
            }
            case '9':
            {
                via_num = 9 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case 'A':
            {
                via_num = 10 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case 'B':
            {
                via_num = 11 * (mutli_num << (4 * tmp));
                res = res + via_num;
                break;
            }
            case 'C':
            {
                via_num = 12 * (mutli_num << (4 * tmp));
                res += via_num;
                break;
            }
            case 'D':
            {
                via_num = 13 * (mutli_num << (4 * tmp));
                res += via_num;
                break;
            }
            case 'E':
            {
                via_num = 14 * (mutli_num << (4 * tmp));
                res += via_num;
                break;
            }
            case 'F':
            {
                via_num = 15 * (mutli_num << (4 * tmp));
                res  += via_num;
                break;
            }
            default:
                break;

            }

        }
        cout << res << endl;
        time_two = clock();
        cout << "TIME = " << (double)(time_two - time_one) / CLOCKS_PER_SEC << endl;
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值