假设一个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;
}