轻松实现C/C++各种常见进制相互转换

 更新时间:2019年11月18日 11:47:59   作者:ericling  
这篇文章主要介绍了轻松实现C/C++各种常见进制相互转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

其它进制转为十进制

在实现这个需求之前,先简单介绍一个c标准库中的一个函数:

long strtol( const char *str, char **str_end, int base);

参数详细说明请 参考文档

注意:这个函数在c标准库stdlib中,所以需要 #include<cstdlib>

用法参考

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
 
int main(void)
{
 // parsing with error handling
 const char *p = "10 200000000000000000000000000000 30 -40 junk";
 printf("Parsing '%s':\n", p);
 char *end;
 for (long i = strtol(p, &end, 10);p != end;i = strtol(p, &end, 10))
 {
 printf("'%.*s' -> ", (int)(end-p), p);
 p = end;
 if (errno == ERANGE){
  printf("range error, got ");
  errno = 0;
 }
 printf("%ld\n", i);
 }
 
 // parsing without error handling
 printf("\"1010\" in binary --> %ld\n", strtol("1010",NULL,2));
 printf("\"12\" in octal --> %ld\n", strtol("12",NULL,8));
 printf("\"A\" in hex --> %ld\n", strtol("A",NULL,16));
 printf("\"junk\" in base-36 --> %ld\n", strtol("junk",NULL,36));
 printf("\"012\" in auto-detected base --> %ld\n", strtol("012",NULL,0));
 printf("\"0xA\" in auto-detected base --> %ld\n", strtol("0xA",NULL,0));
 printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk",NULL,0));
}

Output

Parsing '10 200000000000000000000000000000 30 -40 junk':
'10' -> 10
' 200000000000000000000000000000' -> range error, got 9223372036854775807
' 30' -> 30
' -40' -> -40
"1010" in binary --> 10
"12" in octal --> 10
"A" in hex --> 10
"junk" in base-36 --> 926192
"012" in auto-detected base --> 10
"0xA" in auto-detected base --> 10
"junk" in auto-detected base --> 0

更多详细说明请 参考文档

接下来使用这个函数来实现其它进制转为十进制的需求,具体请参考代码:

#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
 //把8进制的17转化为10进制打印输出
 string str = "17";
 char *tmp ;
 long result = strtol(str.c_str(),&tmp,8);
 cout<<result;
 return 0;
}

Output

15

十进制转为其他进制

目前没有找到可以使用的库函数来方便的实现这个需求,所以自己实现了一下,具体请参考代码:

#include<iostream>
#include<algorithm>
using namespace std;
//digital为10进制数,r为需要转换的目标进制,返回目标进制数
string dtox(int digital,int r){
 string result="";
 const char s[37]="0123456789abcdefghijklmnopqrstuvwxyz";
 if(digital==0){
 return "0";
 }
 while(digital!=0){
 int tmp =digital%r;
 result+=s[tmp];
 digital/=r;
 }
 reverse(result.begin(),result.end());
 return result;
}
int main(){
 cout<<"十进制10转为16进制结果:"<<dtox(10,16)<<endl;
 cout<<"十进制10转为8进制结果:"<<dtox(10,8)<<endl;
 cout<<"十进制10转为2进制结果:"<<dtox(10,2)<<endl;
 cout<<"十进制10转为10进制结果:"<<dtox(10,10)<<endl;
}

Output:

十进制10转为16进制结果:a
十进制10转为8进制结果:12
十进制10转为2进制结果:1010
十进制10转为10进制结果:10

实现效果还算理想,另外,这个函数还可以把10进制数转化为不常用的其他进制,不局限于2,8,10,16等常见进制。但是r的有效范围应该为2-36。

另外,函数并没有考虑负数以及浮点数,r不合法的情况

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++内存数据结构与二进制文件之间的序列化和反序列化方式

    C++内存数据结构与二进制文件之间的序列化和反序列化方式

    这篇文章主要介绍了C++内存数据结构与二进制文件之间的序列化和反序列化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • c++中log4cplus日志库使用的基本步骤和示例代码

    c++中log4cplus日志库使用的基本步骤和示例代码

    这篇文章主要给大家介绍了关于c++中log4cplus日志库使用的相关资料,log4cplus是一款开源的c++日志库,具有线程安全,灵活,以及多粒度控制的特点,log4cplus可以将日志按照优先级进行划分,使其可以面向程序的调试,运行,测试,后期维护等软件全生命周期,需要的朋友可以参考下
    2024-06-06
  • Qt扫盲篇之QRegExp正则匹配类总结

    Qt扫盲篇之QRegExp正则匹配类总结

    这篇文章主要给大家介绍了关于Qt扫盲篇之QRegExp正则匹配类总结的相关资料,QRegExp是Qt框架中的一个类,用于进行正则表达式的匹配和处理,它提供了多种模式来匹配不同的字符串,需要的朋友可以参考下
    2023-12-12
  • C++中单链表的建立与基本操作

    C++中单链表的建立与基本操作

    以下是对C++中单链表的建立与基本操作进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    这篇文章主要为大家详细介绍了如何通过C语言模拟实现qsort(采用冒泡的方式),strcpy,strcat,strcmp等函数,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-11-11
  • c语言实现的带通配符匹配算法

    c语言实现的带通配符匹配算法

    这篇文章主要介绍了c语言实现的带通配符匹配算法,需要的朋友可以参考下
    2015-03-03
  • C语言qsort函数使用方法详解

    C语言qsort函数使用方法详解

    qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • C++使用VLD检测内存泄漏

    C++使用VLD检测内存泄漏

    本文主要介绍了C++使用VLD检测内存泄漏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • c++访问修饰符与继承关系详解

    c++访问修饰符与继承关系详解

    C++提供了三个修饰符来限定类成员的被访问权限,分别是public、protected、private,通过限定访问权限,可以达到程序编写者想要解决的安全问题和权限问题,本文给大家介绍c++访问修饰符与继承关系,感兴趣的朋友一起看看吧
    2023-10-10
  • c语言实现单链表算法示例分享

    c语言实现单链表算法示例分享

    这篇文章主要介绍了c语言实现单链表算法示例,需要的朋友可以参考下
    2014-02-02

最新评论