1.进制转换的方法
以二进制和十进制相互转换为例
1)十进制转二进制
十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
具体用法如下图:
2)二进制转十进制
把二进制数按权展开、相加即得十进制数。
2.现在有如下需求:
将十进制和62进制(0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)进行相互转换。
十进制转62进制,按照除62取余的方法,最后将余数逆序即可。
62进制转十进制,首先需要通过InitChrMap的方法将0-Z 62个字符和十进制一一对应。然后需要将62进制字符串逆序。最后通过按权展开相加即可得到十进制。
代码如下:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "windows.h"
#include <iostream>
using namespace std;
const char* g_char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char g_charMap[255];
//十进制转为62进制
int NumToStr(int num, char* str)
{
if (str == NULL)
{
return 0;
}
int scale = strlen(g_char);//得到进制
if(num < scale)
{
str[0] = g_char[num];
return 1;
}
//num除进制scale,余数为权位上的数,得到的商值继续除进制scale,依此步骤继续向下运算直至商为0为止。从最后一个余数到第一个余数。
int mcale = 0;
int i = 0;
int j = 0;
char chr[8] = {0};
while ((mcale = num/scale) != 0)
{
chr[i++] = g_char[num%scale];
num = mcale;
}
chr[i] = g_char[num];
//转换成从最后一个余数到第一个余数(逆序)
while (i>=0)
{
str[j++] = chr[i--];
}
str[j] = '\0';
return j;
}
void InitChrMap()
{
int i = 0;
while (g_char[i] != '\0')
{
g_charMap[int(g_char[i])] = i;
i++;
}
}
//n的m次方,m为正
int NTimes (int n, int m)
{
int ret = 1;
if (n==0 || m<0)
{
return 0;
}
if (m == 0)
{
return 1;
}
for (int i = 0; i < m; i++)
{
ret *= n;
}
return ret;
}
//62进制转换成十进制
int StrToNum(char * str)
{
if (str == NULL)
{
return -1;
}
int ret = 0;
int len = strlen(str);
char tmpStr[255] = {0};
int scale = strlen(g_char);//得到进制
int i = 0;
//将str逆序
while(len>0)
{
tmpStr[i] = str[len-1];
i++;
len--;
}
tmpStr[i] = '\0';
i = 0;
//按权展开相加即得十进制数
while(tmpStr[i] != '\0')
{
ret += g_charMap[int(tmpStr[i])]*NTimes(scale, i);
i++;
}
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool b_run = true;
char str[255];
char chr[255];
InitChrMap();
while (b_run)
{
memset(str, 0, sizeof(str));
memset(chr, 0, sizeof(str));
cin >> str;
if (str[0] == 0)
{
Sleep(500);
continue;
}
int num = StrToNum(str);
cout << num << endl;
NumToStr(num, chr);
cout << chr << endl;
}
system("pause");
return 0;
}