十六进制转十进制

假设一个16进制的字符串为12F:字符分别为'1','2','F',计算分解为1*16^2+2*16^1+10*16^0。

字符串转化为十进制数方法:
1.读取数组,从第0位字符开始
2.将字符转化为数字。比如从'1'转化为1。参考ASCII码表,字符'0'=48,将字符减去'0'即可。
3.将数组前一个位置字符计算出的十进制数,加上数组后一位计算出的数字。
4.循环累加,直到读取完数组内所有的字符。
注意:如 char strHex[8]="12F"; 字符串最后一位的字符是'\0'。

方法1:利用switch(表达式)...case(条件):结构实现。 

#include <stdio.h> 
#include <iostream>
#include <string> 
#include <math.h> 

using namespace std;
 
int main()  
{  
	// 1.gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取
	//char strHex[8] ;       // 申明,输入一个字符串的数组
	//gets_s(strHex);        // 1.或者利用该函数输入一个十六进制的字符串,以回车键结束。

	// 2.定义一个字符串测试
	//char strHex[8] = "2a";    // 定义一个数组 strHex[] = "2a"
	char strHex[] = "2A";       // 定义一个数组 strHex[] = "2A"
	int n = strlen(strHex);  // 字符数组的长度:n=2  
	cout << "数组长度n=" << n << endl;
	// long sum = 0;         // 32位,long表示带符号的长整数
	_int64 sum = 0;          //_int64:有符号 64 位整数数据类型

	// 3.循环读取字符串中的每个字符
	for (int i = 0; strHex[i]!= '\0'; i++)
	{
		switch (strHex[i]  )
		{
			case 'A':
			case 'a':temp = 10; break; // 如果是'A'与 'a',则=10。
			case 'B':
			case 'b':temp = 11; break;
			case 'C':
			case 'c':temp = 12; break;
			case 'D':
			case 'd':temp = 13; break;
			case 'E': 
			case 'e':temp = 14; break;
			case 'F': 
			case 'f':temp = 15; break;
			default:temp = strHex[i]-'0'; break; //如果字符是数字,则转换为整数数字0-9。
		}
		// 4.static_cast<_int64> 强制类型转换运算符 <要转换到的类型> (待转换的表达式)
		sum += temp * static_cast<_int64> (pow(16, n - 1 - i) );   // 警告:pows是从double 转int 精度丢失。
	}
	cout << "转换后的sum=" << sum << endl;
    system("pause");
    return 0;
} 

方法2:利用if...elseif ...else...  结构实现。 

// 十六进制字符转化为十进制数字:
// 1.数字0~9的的值,即为0到9,然后10为'a'。
// 2.转化为十进制数就是将上面的这个值乘上16。

#include <iostream >
#include <math.h>
#include <stdio.h>

using namespace std;

int main()
{
    int i = 0;             // 循环的个数
    char st[] = "2A";      // 定义一个数组
    //char st[8] = "2A";   //
    
    int n = strlen(st);  // 字符数组的长度:n=2  
    cout << "1.n=" << n << endl;
    int sum = 0;         // 字符转10进制的初始值
    
    // 转化的情况有以下三种:
    // 1.该字符为0~9的字符,便可以将该数字 - ‘0’,使其变为我上面提到的那个值,在乘上16的多少次方即可。
    // 2.该字符为’A’~‘F’的字符,将该字符 - ‘A’后加上10即可,因为直接减去10是将该字符转化到了数字0到9,还需加上10变为十进制的’A’。
    // 3.该字符为’a’~'f’时同2理。
     
    for (i = 0; i < n; i++)
    {
    	cout << "n=" << n << ",i=" << i << endl;
    	//char w =st[i];  // 测试单个字符 
    	//cout << "w=" << w << endl;
    	//cout << "st[i]=" << st[i] << endl;
    	if ('0' <= st[i] && st[i] <= '9')
    	{   cout << "st[i] - '0'=" << st[i] - '0' << endl; // '7'-'0'=7-0=7
    		// 必须-1: i:表示当前位置,n 为总数 ; 字符串最后一位是 16^0=1 
    		sum +=(st[i] - '0' )* pow(16, n - i -1 );  // 16^(n-i-1) 
    	}
    	else if ('A' <= st[i] && st[i] <= 'F')
    	{   // 'F' - 'A'=15-10=5  
    		sum += (st[i] - 'A' + 10) * pow(16, n - i - 1); 
    	}
    	else    //('a' <= st[i] && st[i] <= 'f')
    	{   // 'f' - 'a'=15-10=5
    		sum += (st[i] - 'a' + 10) * pow(16, n - i - 1);
    	}
    	cout << "sum=" << sum << endl; // 警告:pows是从double 转int精度丢失。
    }
    system("pasue");
    return 0;
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

azoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值