今天看书讲到十进制、二进制、十六进制的互相转换,自己试了下。十进制和十六进制互相转换需要借助二进制作为中间媒介。用到了STL标准库的向量、队列、字符串。
// decimal2hex2decimal.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <deque>
using namespace std;
//十进制转为二进制
vector<int> dec2bin(int num)
{
vector<int> myvec;
vector<int> binVec;
//vector<int>::iterator Biter;
vector<int>::iterator iter;
while(num/2 != 0)
{
if(num%2 == 0)
{
myvec.push_back(0);
}
else
{
myvec.push_back(1);
}
num=num/2;
}
myvec.push_back(1);
//反转一下向量实现真正转为二进制
for(iter=myvec.end(); iter!=myvec.begin(); iter--)
{
binVec.push_back(*(iter-1));
//cout<<(*iter);
}
return binVec;
}
//十进制转为十六进制
string dec2hex(int num)
{
//十进制先转化为二进制
string str;
vector<int> myvec;
deque<int> mydeq;//队列可以前后插
vector<int> vec4;
vector<int>::iterator iter;
deque<int>::iterator Diter;
vector<int>::iterator viter;
myvec = dec2bin(num);
//然后每4位转为一个十六进制
for(iter=myvec.begin(); iter!=myvec.end(); iter++)
{
mydeq.push_back(*iter);
}
int len=myvec.size();
int mod=len%4;
if(mod != 0)
{
for(int i=0; i<(4-mod); i++)
{
mydeq.push_front(0);
}
}
cout<<endl<<"补全"<<endl;
for(Diter=mydeq.begin(); Diter!=mydeq.end(); Diter++)
{
cout<<(*Diter);
}
cout<<endl;
int sum=0;
int j=0;
int a;
string s;
for(Diter=mydeq.begin(); Diter!=mydeq.end(); Diter++)
{
++j;
vec4.push_back(*Diter);
if(j==4)
{
for(viter=vec4.end(), a=0; viter!=vec4.begin(); viter--, a++)
{
sum=sum + (*(viter-1))*pow(2.0,a);
}
if(sum<10)
s='0'+sum;
else
s='A'+sum-10;
str=str+s;
s.clear();
j=0;
sum=0;
vec4.clear();
}
}
return str;
}
//二进制转为十进制
int bin2dec(vector<int> vec)
{
//int num;
vector<int>::iterator iter;
int sum=0, a;
for(iter=vec.end(), a=0; iter!=vec.begin(); iter--, a++)
{
sum = sum + (*(iter-1))*pow(2.0, a);
}
return sum;
}
//十六进制转为十进制
int hex2dec(string str)
{
vector<int> myvec;
for(int i=0; i<str.size(); i++)
{
switch(str.at(i))
{
case '0':
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(0);
break;
case '1':
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(1);
break;
case '2':
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(0);
break;
case '3':
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(1);
break;
case '4':
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(0);
break;
case '5':
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(1);
break;
case '6':
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(0);
break;
case '7':
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
break;
case '8':
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(0);
break;
case '9':
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(0);
myvec.push_back(1);
break;
case 'A':
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(0);
break;
case 'B':
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(1);
myvec.push_back(1);
break;
case 'C':
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(0);
break;
case 'D':
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(0);
myvec.push_back(1);
break;
case 'E':
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(0);
break;
case 'F':
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
break;
}
}
int num = bin2dec(myvec);
return num;
}
int _tmain(int argc, _TCHAR* argv[])
{
//首先是十进制转二进制
vector<int> myvec;
vector<int>::iterator iter;
cout<<"请输入一个十进制数:"<<" ";
int num;
cin>>num;
myvec = dec2bin(num);
cout<<"转换成二进制数为:"<<" ";
/*cout<<myvec.size()<<endl;*/
for(iter=myvec.begin(); iter!=myvec.end(); iter++)
{
cout<<(*iter);
}
cout<<endl;
cout<<"转换成十六进制数为:";
string str = dec2hex(num);
cout<<str<<endl;
//二进制转十进制
cout<<"二进制转十进制为:";
int number = bin2dec(myvec);
cout<<number<<endl;
//十六进制转十进制
cout<<"十六进制转十进制为:";
int numb = hex2dec(str);
cout<<numb<<endl;
system("pause");
return 0;
}
结果: