[代码范例]用C++实现的简单无符号整数进制转换器
大家好啊,今天为大家带来的是自己实现的用C++编写的简单进制转换器,用于10进制数和8进制数,16进制数,2进制数的相互转换.
首先,说明一下什么是进制.n进制就是一种用来表示数值的方法,n进制,顾名思义,逢n进1.我们日常生活中使用的基本都是10进制数,逢10进1;现代计算机处理器所能处理的只能是2进制数,虽然好像前苏联曾经尝试研制10进制计算机,最后当然无疾而终.
计算机使用2进制的原因是它实现简单,仅有0和1两个码元,又和自然世界某些事物的两种状态相对应(比如开关的开和断开,电平的高和低等).在我们记录和汇编语言的编写中,常常使用16进制数,便于书写,因为一个16进制数对应4个2进制数.一个8进制数对应3个2进制数,而一个10进制数对应4个2进制数,存在6个冗余码.在高级程序设计语言中,2进制,8进制,16进制分别用0b,0,0x作为前缀表示,如0xB2代表10进制数178.在汇编语言中,用B,O,H作为作为后缀表示,如30H代表十进制数48,同时也是字符'0'的ASCII码.
实现该小程序的关键是数制转换算法.无符号整数从任意进制到10进制,按权展开即可;从十进制到任意进制,采用短除法取余数直至商为零.
短除法示例,十进制数53对应二进制数0b110101
下面进入正题,整个工程由自定义头文件convertfuncs.h和源程序文件main.cpp构成,代码如下:
convertfuncs.h:
1 #ifndef CONVERTFUNCS_H_INCLUDED 2 #define CONVERTFUNCS_H_INCLUDED //包含警戒 3 4 #include<iostream> 5 6 using namespace std; 7 8 const unsigned limit = (unsigned)(sizeof(unsigned)*8*0.3+1); //限定可处理的10进制数最多位数,由机器实现决定 9 10 string deciToHex(unsigned deci) { //10进制转16进制函数 11 12 string hexStr(0.75*limit, ' '); //目标字符串预留出一定空间,16进制数位数为对应10进制数的3/4,调用string类的构造函数 13 int Value=0; //Value保存每次短除法的余数 14 int i = 0; 15 16 if( deci < 10) //待转换数小于10时,16和10进制表示方法相同 17 return string(1,(char)deci); 18 19 for(; deci != 0; ++i, deci /= 16) { //短除法循环 20 Value = deci%16; 21 switch(Value) { //多分支选择表示10~15的字母 22 case 10 :hexStr.at(i) = 'A'; break; 23 case 11 :hexStr.at(i) = 'B'; break; 24 case 12 :hexStr.at(i) = 'C'; break; 25 case 13 :hexStr.at(i) = 'D'; break; 26 case 14 :hexStr.at(i) = 'E'; break; 27 case 15 :hexStr.at(i) = 'F'; break; 28 default :hexStr.at(i) = Value+'0'; //用数字表示的要将数字转化为对应的字符 29 } 30 } 31 hexStr=hexStr.substr(0, i); //取有字符的字串 32 33 reverse(hexStr.begin(), hexStr.end()); //使用迭代器反转字符串,因为写入的高低位颠倒 34 35 return hexStr; //返回对应的16进制数字符串 36 } 37 38 string deciToOct(unsigned deci) { //10进制转8进制函数,结构类似于上 39 40 string hexStr(limit, ' '); 41 int Value=0; 42 int i = 0; 43 44 if( deci < 8) 45 return string(1,(char)deci); 46 47 for(; deci != 0; ++i, deci /= 8) { 48 Value = deci%8; 49 hexStr.at(i) = Value+'0'; 50 } 51 52 hexStr=hexStr.substr(0, i); 53 54 reverse(hexStr.begin(), hexStr.end()); 55 56 return hexStr; 57 } 58 59 string deciToBin(unsigned deci) { //10进制转2进制函数,结构类似于上 60 61 string hexStr(3*limit, ' ' ); 62 int Value=0; 63 int i = 0; 64 65 for(; deci != 0; ++i, deci /= 2) { 66 Value = deci%2; 67 hexStr.at(i) = Value+'0'; 68 } 69 70 hexStr=hexStr.substr(0, i); 71 72 reverse(hexStr.begin(), hexStr.end()); 73 74 return hexStr; 75 } 76 77 long anyToDeci(string any, unsigned scale){ //按权展开函数 78 79 long sum = 0; //sum为累加和 80 int n = any.length(); //使用string类的方法获得字符串长度 81 82 for(int i = 0; i < n; i++) 83 if(any.at(i) >= '0' && any.at(i) <= '9') 84 sum += (any.at(i) - '0')* pow(scale, n-1-i); //按权展开的幂乘和累加 85 else if(any.at(i) >= 'a' && any.at(i) <= 'f') //对16进制用字母表示的数的处理 86 sum += (any.at(i) - 'a'+10)* pow(scale, n-1-i); 87 else 88 sum += (any.at(i) - 'A'+10)* pow(scale, n-1-i); 89 return sum; 90 } 91 92 #endif // CONVERTFUNCS_H_INCLUDED
limit是输入的十进制数最多位数.若sizeof(unsigned)在某机器上为4,即无符号整数占用4Byte,也即32位,最大数为232,根据210≈103,有220≈106 ,230≈109,因此232至少用10位10进制数表示,因此输入的十进制数最多10位.
main.cpp:
1 #include<iostream> 2 #include<algorithm> //reverse函数声明在次头文件中 3 #include"convertfuncs.h" //自定义头文件 4 5 using namespace std; 6 7 int main(){ 8 9 system("color 3F"); //设置控制台窗口背景色和前景色 10 11 int k = 0; 12 unsigned deci = 0; //输入的10进制数 13 extern string deciToHex(unsigned); 14 extern string deciToOct(unsigned); 15 extern string deciToBin(unsigned); 16 extern long anyToDeci(string, unsigned); //函数原型 17 string any = ""; //预留的空字符串 18 unsigned scale=0; //进制标识 19 20 cout<<"无符号整数数制转换器"<<endl; 21 cout<<"By Alexios Yan"<<endl; 22 cout<<endl; 23 24 while(true){ //无限循环功能菜单 25 cin.sync(); //清空输入缓冲区 26 cout<<"按任意键继续"<<endl; 27 cin.get(); 28 system("cls"); //清屏 29 cout<<"功能列表:"<<endl; 30 cout<<"0. 退出"<<endl; 31 cout<<"1. 10进制到16进制"<<endl; 32 cout<<"2. 10进制到8进制"<<endl; 33 cout<<"3. 10进制到2进制"<<endl; 34 cout<<"4. 2或8或16进制到10进制"<<endl; 35 cout<<endl; 36 cout<<"请选择:"<<endl; 37 cin>>k; 38 39 switch(k){ //根据选择调用不同函数 40 case 0 : exit(0); 41 break; 42 case 1 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl; 43 cin>>deci; 44 cout<<"对应的16进制数是0x"<<deciToHex(deci)<<endl; 45 cout<<endl; 46 break; 47 case 2 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl; 48 cin>>deci; 49 cout<<"对应的8进制数是0"<<deciToOct(deci)<<endl; 50 cout<<endl; 51 break; 52 case 3 : cout<<"请输入需要转换的10进制数(不多于"<<limit-1<<"位):"<<endl; 53 cin>>deci; 54 cout<<"对应的2进制数是0b"<<deciToBin(deci)<<endl; 55 cout<<endl; 56 break; 57 case 4 : cout<<"请输入需要转换到10进制的数:"<<endl; 58 cin>>any; 59 cout<<"请输入该数的进制:"<<endl; 60 cin>>scale; 61 cout<<"结果是"<<anyToDeci(any, scale)<<endl; 62 cout<<endl; 63 break; 64 default : cout<<"选择错误,请重新选择"<<endl; 65 cout<<endl; 66 break; 67 } 68 } 69 return 0; 70 }
本工程在GCC编译器下编译通过,成功运行.在GCC编译器在,不允许在switch语块中定义变量.
运行截图:
谢谢大家!转载请注明出处,谢谢合作!
- 1楼大大维
- 高产啊