一直在刷题的时候,都会遇到一个坑,就是进制转换的问题。而每一次都傻乎乎的自己去实现一个。所以算是对以前的坑的一个总结。

  • itoa 函数

    • itoa是广泛应用的非标准C语言和C++语言扩展函数。由于它不是标准C/C++语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在<stdlib.h>/<cstdlib>头文件中包含这个函数。
      //函数原型
      char *itoa(int value, char *str, int radix) value 是被转换的整数
      str 转换后存储的字符数组
      radix 转换进制数,可以是 2, 8, 10, 16 等等

      由上可知,itoa可以实现10到2、8、16的转换,8到2、10、16的转换,16到2、8、10的转换,唯独没有2进制到其他进制的转换

    • 相关测试如下:
      #include<stdio.h>
      #include<stdlib.h>
      #include<string.h> int main()
      {
      char str[25]; memset(str, 0, sizeof(str));
      itoa(98, str, 2);
      printf("10--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(98, str, 8);
      printf("10--8进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(98, str, 16);
      printf("10--16进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 2);
      printf("8--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 10);
      printf("8--10进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(076, str, 16);
      printf("8--16进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 2);
      printf("16--2进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 8);
      printf("16--8进制: %s\n", str); memset(str, 0, sizeof(str));
      itoa(0xffff, str, 10);
      printf("16--10进制: %s\n", str);
      return 0;
      }

      程序运行结果如下:

  • sprintf 函数

    • 把格式化数据写入某个字符缓冲区中,头文件为<stdio.h>/<cstdio>
      //函数原型
      int sprintf(char *buffer, const char *format, [argument]...) buffer: char*型数组,指向将要写入的字符串的缓冲区
      format: 格式化字符串
      [argument]...: 可选参数,就是任何类型的数据

      sprintf可完成8,10,16进制间的互相转换。

    • 相关测试如下:
      #include<stdio.h>
      #include<string.h>
      #include<stdlib.h>
      int main(){
      char str[25]; memset(str, 0, sizeof(str));
      sprintf(str, "%o", 1024);
      printf("8进制: %s\n", str); memset(str, 0, sizeof(str));
      sprintf(str, "%x", 1024);
      printf("16进制: %s\n", str); return 0;
      }

      程序结果如下:

  • stoi, stol, stoll, stof, stod, stold

    • C++11新引入的string的api, 完成string向数值类型的转换

    • stoi:可实现任意进制数转10进制数,返回一个int数

      //函数原型
      int stoi(const string &str, size_t* idx = 0, int base = 10) str: 要转换的string
      idx: 为size_t*类型,是从str中解析出一个整数后的下一个字符的位置
      base: 指出string中要转换的数的进制,即str所代表的是个什么进制的数,如是base默认为10, 若base = 0, 表示由编译器自动判定str所代表的数的进制

      测试如下:

      #include<iostream>
      #include<string>
      using namespace std; int main(){
      string str_dec = "2048,hello world";
      string str_hex = "40c3";
      string str_bin = "-10010110001";
      string str_auto = "0x7f"; size_t sz; // alias of size_t
      int i_dec = std::stoi(str_dec, &sz);
      int i_hex = std::stoi(str_hex, nullptr, 16);
      int i_bin = std::stoi(str_bin, nullptr, 2);
      int i_auto = std::stoi(str_auto, nullptr, 0); std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
      std::cout << str_hex << ": " << i_hex << '\n';
      std::cout << str_bin << ": " << i_bin << '\n';
      std::cout << str_auto << ": " << i_auto << '\n';
      }

      结果如下:

    • stod:将str转为double

      //函数原型
      double stod(const string &str, size_t *idx = 0) str: 要转换的string
      idex: 保存转换后的下一个字符位置

      测试如下:

      #include<iostream>
      #include<string>
      using namespace std; int main(){
      std::string orbits ("365.24 29.53");
      std::string::size_type sz; // alias of size_t double earth = std::stod (orbits,&sz);
      double moon = std::stod (orbits.substr(sz));
      std::cout << "The moon completes " << (earth/moon) << " orbits per Earth year.\n";
      return 0;
      }

      结果如下:

    • 其他函数可以根据这两个类推出来,不再赘述。

  • 总结:

    • stoi,stod等函数为C++11新加入,应该掌握
    • sprintf 功能略强大,值得研究注意
    • itoa 非标准库函数
    • 下一次,我不希望看到你再写跟进制转换相关的东西了,有现成的就该用。

C++中进制转换问题的更多相关文章

  1. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  2. python中进制转换

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...

  3. python 中进制转换及format(),int()函数用法

    python中数值型变量好像只能是十进制形式表示,其他类型变量只能以字符串形式存在,可以通过format函数将int类型变量转换成其他进制字符串,如下所示: v_code=15 # 2进制 x=for ...

  4. linux中进制转换

    方式一:使用$[]或$(()) 格式为:$[base#number]或$((base#number)),其中base为进制,number为对应进制数. 这种方式输入2进制.16进制等,但只能输出为10 ...

  5. .Net 之进制转换 余位补全

    十进制转二进制 Convert.ToString(n, 2) 其中 n -- 源类型 可以是shrot Byte Int Uint Long 2 -- 目标位 可以是2,8,10,16 同理十进制转1 ...

  6. jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

    原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...

  7. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  8. JavaSE教程-03Java中分支语句与四种进制转换

    一.分支语句 计算机源于生活,程序模拟现实生活,从而服务生活 行为模式 1,起床,刷牙,洗脸,吃早餐,上课,回家,睡觉(顺序性) 2,如果时间不太够,打个滴滴快车,如果时间够,坐个地铁(选择性) 3, ...

  9. Python中数字之间的进制转换

    Python中的数据转换 在python中可以通过内置方法进行相应的进制转换,但需记得转化成非十进制时,都会将数字转化成字符串 转化成二进制 a = 10 #声明数字,默认十进制 b = bin(a) ...

随机推荐

  1. CI Weekly #14 | 如何搭建合适的持续交付开发流程?

    时隔 10 个月,flow.ci 开始正式收费上线.为感谢对我们的内测支持,所有内测用户可继续免费使用基础版 30 天,截止至 3 月 15 日失效.欢迎随时告诉我们你对收费版 flow.ci 的反馈 ...

  2. SpringBoot实践 - SpringBoot+MySql+Redis

    大家都知道redis的强大之处,在目前应用上也是大显神威. 先说说他的优点: 1 读写性能优异 2 支持数据持久化,支持AOF日志和RDB快照两种持久化方式 3 支持主从复制,主机会自动将数据同步到从 ...

  3. 初学jQuery之jQuery选择器

    今天我们就谈论一下jquery选择器,它们大致分成了四种选择器!!!! 1.基本选择器(标签,ID,类,并集,交集,全局) 1.0(模板) <body> <div id=" ...

  4. JTextArea与TextArea自动换行和滚动条的区别对比

    最近在用Java写一个仿记事本的程序,但是发现用JTextArea写的效果有点差,但是用TextArea自动换行并不那么方便,经过对比和实践,我也发现自己对这两个标签认识存在不足,下面就来讨论一下他们 ...

  5. Pro Git CN Plus

    Git — The stupid content tracker, 傻瓜内容跟踪器.Linus 是这样给我们介绍 Git 的. Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 ...

  6. Bitmap的加载和Cache

    由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16M,这导致加载Bitmap的时候很容易出现内存溢出.比如以下场景: java.lang.OutofMemoryError: ...

  7. Matlab立体标定mat转换成Opencv的CvMat

    最近在做基于双目视觉的三维重建.比较opencv和matlab工具箱的立体标定结果精度时,发现貌似如果手工选取角点不那么离谱的话,matlab标定结果精度更高也更鲁棒.就想先用matlab标定好相机, ...

  8. ABP 学习汇总

    本文背景 公司最近规划的新框架准备基于ABP来搭建,自从在阳铭博客看到ABP框架的介绍后,就一直持续关注着,但还没真正在实际项目中直接使用ABP,只是自己做了一些学习和Demo.ABP所用到的一些新技 ...

  9. 关于input只能输入数字的两种小方法

    第一种: 直接给input标签 name赋值如下 <input name="start_price" id="start_price" type=&quo ...

  10. 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap

    1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...