先把代码给出来,在解释。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
string int2str(int aNum)
{
stringstream res;
res << aNum;
string s;
res >> s;
return s;
}
int char2int(char s)
{
stringstream res;
res << s;
int n;
res >> n;
return n;
}
int cifang16(int aNum, int time)//1 0
{
int sum = 1;
for(int i = 0; i < time; i++)
{
sum = sum * 16;
}
return sum * aNum;
}
int hex2dec(char hex, int time)
{
int num;
if(hex == 'A' || hex == 'a')
num = 10;
else if(hex == 'B' || hex == 'b')
num = 11;
else if(hex == 'C' || hex == 'c')
num = 12;
else if(hex == 'D' || hex == 'd')
num = 13;
else if(hex == 'E' || hex == 'e')
num = 14;
else if(hex == 'F' || hex == 'f')
num = 15;
else
num = char2int(hex);
num = cifang16(num, time);
return num;
}
int binLen;
string ShortDivide(int dec)
{
int everytime, yu;
string num = "";
while(dec != 0)
{
num += int2str(dec % 2);
dec = dec / 2;
}
binLen = num.size();
return num;
}
string Dec2Bin(int dec)
{
string lbin = ShortDivide(dec);
return lbin;
}
int main()
{
string hexNum;//十六进制数 △
cin >> hexNum;//10
int hlen = hexNum.size();
int dec = 0;//十进制数 △
for(int i = 0; i < hlen; i++)
{
dec += hex2dec(hexNum[hlen - i - 1], i);
}
cout << "十进制 " << dec << endl;
//ShortDivide()函数
string bin = Dec2Bin(dec);//二进制数△
int k = binLen % 4;
cout << setw(4 - k + 1) << setfill('0');
for(int i = binLen - 1; i >= 0; i--)
{
cout << bin[i];
}
cout << endl;
return 0;
}
这个代码很长,但是很松散,也相对写的简单,因为有bitset函数库可以专门做进制转换,c++是支持的。
有两个新的函数库
#include “sstream”
和
#include “iomanip”
这两个函数库上百度搜索一下就出来了。
sstream能实现数据类型转换,见int2str()和char2int()函数,其中用stringstream定义了一个res变量,把int和char类型的变量计入,在转换成int和string类型返回,这个比-‘0’,+‘0’等工具好多了。
iomanip是一个输出控制的函数库,可以实现输出前补前缀,等功能,我用的是补前导0.
cout << setw(4 - k + 1) << setfill('0');
这一行在输出中用setw()确定输出多少个前导,用setfill()说明补的是什么。
setw()里面是我加的一个运算。
你们可以自己上电脑编译运行一下。
进制转换的方法就是先把16进制转换成10进制,用乘次方的办法,再把10进制转换成2进制,用短除(不懂可以百度一下)。
最后用字符串。
帮忙点个赞,谢了!