进制转换方法汇总表
原进制 |
转换进制 |
方法1 |
方法2 |
方法3 |
方法4 |
十进制 |
二进制 |
bitset指定格式输出 |
|
除留余数法 |
itoa |
十进制 |
八进制 |
oct/%o指定格式输出 |
流 |
除留余数法 |
itoa |
十进制 |
十六进制 |
hex/%x指定格式输出 |
流 |
除留余数法 |
itoa |
十进制 |
其他进制 |
|
|
除留余数法 |
itoa |
二进制 |
八进制 |
三位一组 |
|
|
|
二进制 |
十进制 |
按权展开 |
|
|
strtol |
二进制 |
十六进制 |
四位一组 |
|
|
|
八进制 |
二进制 |
一位换三 |
|
除留余数法 |
|
八进制 |
十进制 |
按权展开 |
流 |
|
strtol |
八进制 |
十六进制 |
|
流 |
|
|
十六进制 |
二进制 |
一位换四 |
|
除留余数法 |
|
十六进制 |
八进制 |
|
流 |
|
|
十六进制 |
十进制 |
按权展开 |
流 |
|
strtol |
基本操作函数:
Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
功能实现函数:
ToAll() 十进制转任意进制 调用函数Itoa,自带的itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流
1.任意进制转十进制
【分析】按权展开,求和即可。例如,二进制数110,即4+2+0=6;另外,不想自己写的话,有strtol函数(百度百科)。
long int strtol(const char *nptr,char **endptr,int base);参数:字符串,非法字符指针,字符串中的进制
考虑的很详细,字符串中含有非法的字符(,.*等)时还能停止转换,并返回指针。
2.十进制转任意进制
【分析】除留余数法,逆序输出余数即可。另外,如果自己不想写的话,有itoa函数。
string itoa(int x,char *string,int jz);参数:想要转换的数,转换结果字符串,转换结果的进制
3.指定格式与流
【分析】主要是八进制、十进制和十六进制。对c来说是%o%d,%x;对c++来说是oct,dec,hex。作者感觉所谓的指定格式是输入输出流,sstream的stringstream类是字符串流,本质上应该是差不多的,就写在了一起。学的不深,没有看标准库中类的源代码,请大神指点。
4.二、八、十六之间的转换
【分析】表格里面的一位换四,三位一组之类的是指通过二进制。例如,二进制与八进制进行转换,二进制的110就是八进制的6。反过来,八进制转为二进制,只需要一位转换为三位,6换为110即可。由于也不多,大家都很熟悉,没必要用除留余数法,可以自己写个映射之类的。至于八进制与十六进制的转换,可以利用二进制或十进制作为跳板。(这个代码里面没有,读者可以尝试写一下)
5.全部代码
/*
Project: 进制转换(Radix)
Date: 2019/02/24
Author: Frank Yu
基本操作函数:
Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
功能实现函数:
ToAll() 十进制转任意进制 调用函数Itoa
ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
Stream() 作用:利用sstream头文件将数按某进制读入流,输出流
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。