[C++]实现简单无符号整数进制转换器
2018-06-17 23:40:46来源:未知 阅读 ()
大家好啊,今天为大家带来的是自己实现的用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 13 string hexStr(0.75 * limit, ' '); //目标字符串预留出一定空间,16进制数位数为对应10进制数的3/4,调用string类的构造函数 14 int Value = 0; //Value保存每次短除法的余数 15 int i = 0; 16 17 if ( deci < 10) //待转换数小于10时,16和10进制表示方法相同 18 return string(1, (char)deci); 19 20 for (; deci != 0; ++i, deci /= 16) //短除法循环 21 { 22 Value = deci % 16; 23 24 switch (Value) //多分支选择表示10~15的字母 25 { 26 case 10 : 27 hexStr.at(i) = 'A'; 28 break; 29 30 case 11 : 31 hexStr.at(i) = 'B'; 32 break; 33 34 case 12 : 35 hexStr.at(i) = 'C'; 36 break; 37 38 case 13 : 39 hexStr.at(i) = 'D'; 40 break; 41 42 case 14 : 43 hexStr.at(i) = 'E'; 44 break; 45 46 case 15 : 47 hexStr.at(i) = 'F'; 48 break; 49 50 default : 51 hexStr.at(i) = Value + '0'; //用数字表示的要将数字转化为对应的字符 52 } 53 } 54 55 hexStr = hexStr.substr(0, i); //取有字符的字串 56 57 reverse(hexStr.begin(), hexStr.end()); //使用迭代器反转字符串,因为写入的高低位颠倒 58 59 return hexStr; //返回对应的16进制数字符串 60 } 61 62 string deciToOct(unsigned deci) //10进制转8进制函数,结构类似于上 63 { 64 65 string hexStr(limit, ' '); 66 int Value = 0; 67 int i = 0; 68 69 if ( deci < 8) 70 return string(1, (char)deci); 71 72 for (; deci != 0; ++i, deci /= 8) 73 { 74 Value = deci % 8; 75 hexStr.at(i) = Value + '0'; 76 } 77 78 hexStr = hexStr.substr(0, i); 79 80 reverse(hexStr.begin(), hexStr.end()); 81 82 return hexStr; 83 } 84 85 string deciToBin(unsigned deci) //10进制转2进制函数,结构类似于上 86 { 87 88 string hexStr(3 * limit, ' ' ); 89 int Value = 0; 90 int i = 0; 91 92 for (; deci != 0; ++i, deci /= 2) 93 { 94 Value = deci % 2; 95 hexStr.at(i) = Value + '0'; 96 } 97 98 hexStr = hexStr.substr(0, i); 99 100 reverse(hexStr.begin(), hexStr.end()); 101 102 return hexStr; 103 } 104 105 long anyToDeci(const string any, const unsigned scale) //按权展开函数 106 { 107 108 long sum = 0; //sum为累加和 109 int n = any.length(); //使用string类的方法获得字符串长度 110 111 for (int i = 0; i < n; i++) 112 if (any.at(i) >= '0' && any.at(i) <= '9') 113 sum += (any.at(i) - '0') * pow(scale, n - 1 - i); //按权展开的幂乘和累加 114 else if (any.at(i) >= 'a' && any.at(i) <= 'f') //对16进制用字母表示的数的处理 115 sum += (any.at(i) - 'a' + 10) * pow(scale, n - 1 - i); 116 else 117 sum += (any.at(i) - 'A' + 10) * pow(scale, n - 1 - i); 118 119 return sum; 120 } 121 122 123 #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 10 system("color 3F"); //设置控制台窗口背景色和前景色 11 12 int k = 0; 13 unsigned deci = 0; //输入的10进制数 14 extern string deciToHex(unsigned); 15 extern string deciToOct(unsigned); 16 extern string deciToBin(unsigned); 17 extern long anyToDeci(string, unsigned); //函数原型 18 string any(""); //预留的空字符串 19 unsigned scale = 0; //进制标识 20 21 cout << "无符号整数数制转换器" << endl; 22 cout << "By Alexios Yan" << endl; 23 cout << endl; 24 25 while (true) //无限循环功能菜单 26 { 27 cin.sync(); //清空输入缓冲区 28 cout << "按任意键继续" << endl; 29 cin.get(); //读取一个字符 30 system("cls"); //清屏 31 cout << "功能列表:" << endl; 32 cout << "0. 退出" << endl; 33 cout << "1. 10进制到16进制" << endl; 34 cout << "2. 10进制到8进制" << endl; 35 cout << "3. 10进制到2进制" << endl; 36 cout << "4. 2或8或16进制到10进制" << endl; 37 cout << endl; 38 cout << "请选择:" << endl; 39 cin >> k; 40 41 switch (k) //根据选择调用不同函数 42 { 43 case 0 : 44 exit(EXIT_SUCCESS); 45 break; 46 47 case 1 : 48 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl; 49 cin >> deci; 50 cout << "对应的16进制数是0x" << deciToHex(deci) << endl; 51 cout << endl; 52 break; 53 54 case 2 : 55 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl; 56 cin >> deci; 57 cout << "对应的8进制数是0" << deciToOct(deci) << endl; 58 cout << endl; 59 break; 60 61 case 3 : 62 cout << "请输入需要转换的10进制数(不多于" << limit - 1 << "位):" << endl; 63 cin >> deci; 64 cout << "对应的2进制数是0b" << deciToBin(deci) << endl; 65 cout << endl; 66 break; 67 68 case 4 : 69 cout << "请输入需要转换到10进制的数:" << endl; 70 cin >> any; 71 cout << "请输入该数的进制:" << endl; 72 cin >> scale; 73 cout << "结果是" << anyToDeci(any, scale) << endl; 74 cout << endl; 75 break; 76 77 default : 78 cout << "选择错误,请重新选择" << endl; 79 cout << endl; 80 break; 81 } 82 } 83 84 return 0; 85 }
本工程在GCC编译器下编译通过,成功运行.在GCC编译器在,不允许在switch语块中定义变量.
运行截图:
本人原创,转载请注明出处,谢谢合作!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:静态库和动态库的区别
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash