zoukankan      html  css  js  c++  java
  • C++实现进制转换

    知识内容:

    1.string类基本使用

    2.10进制转2进制

    3.10进制转8进制和10进制转16进制

    4.上述3种转换的递归实现

    注:进制的表示:

    • 二进制:开头是0b,eg: 0b1011(注:c/c++中没有二进制字面常量的表示方法,但是在这里为了区分,我们设定此规则)
    • 八进制:开头是0,eg: 017
    • 十六进制:开头是0x,eg: 0x13

    一、string类基本使用

    1.string类介绍

    (1)C++中的string类是什么? -> 了解
    string是C++系统提供的一个类,封装了常用的字符串操作

    (2)C++中string类的优点是什么? -> 了解
    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们完全可以 把它看成是 C++的基本数据类型

    (3)C++中的string类使用原理是什么? -> 了解
    string类是基于 面向对象的思想 编写的类库,要使用string类就要先引入string类即:#include <string>,然后实例化一个 string类对象,然后通过对象名.方法名() 来调用类中的方法

    另外注意 使用string类 必须声明名称空间也就是在引入类的代码后 加上这一句: using namespace std;

    2.使用string类

    string类中的常用方法及操作 -> 只介绍了最常用的4种,基本上会了以下4个方法字符串的常规操作都能简单完成,关于string类详细方法见此:https://www.cnblogs.com/wyb666/p/8644342.html
    (1)初始化

    • string s;   //生成一个空字符串 -> 最常用,一般直接使用这个创建字符串
    • string s("hello world!"); //生成一个字符串,字符串为"hello world!"
    • string s(5, 'c');        //用5个c生成一个字符串,字符串为"ccccc"
    • 还有些方法不是很常用就不在这里介绍了    

    注:(2)-(4)使用前需使用(1)中方法生成字符串对象,然后使用字符串对象.方法名来调用方法

    (2) 求长度

    • length()
    • size()


    (3) 拼接字符串、字符串比较

    • 拼接字符串可以直接使用 +
    • 字符串比较可以直接使用 > < >= <= ==


    (4) 字符串取值、字符串赋值
    字符串取值:

     字符串对象[index]
    字符串赋值:

        字符串对象 = 字符串对象
        字符串对象[index] = 字符

    使用实例:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     string s;
     8     s = "hello";        // string对象可直接赋值 
     9     cout << s << endl;
    10     s += " zl";            // string对象可直接与其他字符串相加 
    11     cout << s << endl;
    12     cout << s.length() << endl;     //输出字符串长度
    13     
    14     //字符串比较 
    15     if(s=="hello world")
    16     {
    17         cout << "equal to 'hello world'" << endl;
    18     } 
    19     else
    20     {
    21         cout << "not equal to 'hello world'" << endl;
    22     }
    23     
    24     s[7] = 'z';              //字符串赋值 
    25     cout << s << endl;
    26     cout << s[0] << endl; //输出字符串中第一个字符的值 
    27     
    28     return 0;
    29 }

    二、10进制转2进制

    1.实现原理

    10进制转2进制:整除去余法,详细步骤见下图

    思路:我们每次把一个数除2把余数存起来,然后把这个数赋值为除2后的结果,循环下去直到这个数为0时退出循环,在上述的过程中这一系列余数我们可以保存在字符串中或者数组中

    2.函数逻辑设计

    为了让程序逻辑更清楚,我们将所有的功能封装到函数中,主函数只负责主逻辑,另外有一个专门的函数output_outcome来控制程序输出的结果格式,在这个函数中调用函数transfer_binary将要转化成2进制的10进制数转化成2进制

    由此我们程序的最核心就是transfer_binary函数,这个函数就是实现10进制转2进制,函数参数为10进制数(int),函数返回值为string类字符串

    关于为什么使用string类字符串:string类字符串使用简单方便,内部封装了很多方法,当然在上述思路中的提到的余数也可以存储到数组中,然后最后把数组到者输出就是二进制了

    transfer_binary函数思路:

    假设参数为number,写一个死循环(循环必须在某处跳出!),在循环中,将number%2放入字符串或数组中,然后将number赋值为number/2,在循环最后判断是否number为0,如果number为0就break退出程序

    有了上述的transfer_binary函数的思路后,写程序无非就是不断尝试,看输出结果,根据输出结果不断去调试代码,修改代码,直到最后实现自己想要的功能,没有人可以一次性把一个功能写完,经历了很多次的努力与尝试是很正常的事,有点小挫折没什么大不了的

    3.代码实现

     1 //  输出0--32的二进制数
     2 //    非递归 
     3 
     4 #include <iostream>
     5 #include <string>
     6 using namespace std;
     7 
     8 //将数字转化成二进制  返回二进制字符串 
     9 string transfer_binary(int n)
    10 {
    11     string res;
    12     string flag("0b");
    13     while(true)
    14     {
    15         int i;
    16         i = n%2;
    17         n = n/2;
    18         switch(i)
    19         {
    20             case 1: res = '1' + res; break;
    21             case 0: res = '0' + res; break;
    22         }
    23         if(n==0) break;
    24     }    
    25     // 加上二进制的标志位 
    26     res = flag + res;
    27     
    28     return res;
    29 }
    30 
    31 //输出最后结果 
    32 void output_binary(int n)
    33 {
    34     cout << n << ": " << transfer_binary(n) << endl;
    35 }
    36 
    37 int main()
    38 {
    39     for(int i=0;i<=32;i++)
    40     {
    41         output_binary(i);
    42     }
    43     
    44     return 0;
    45 }

    三、10进制转8进制和10进制转16进制

    1.原理:

    学会上面的10进制转2进制后,10进制转8进制或10进制转16进制都很简单,在原理上是一样的,不过8进制以8为基数,16进制的基数是16,10以后以字母代替。

    2.代码实现

    10进制转8进制实现:

     1 //  输出0--32的八进制数
     2 //    非递归 
     3 
     4 #include <iostream>
     5 #include <string>
     6 using namespace std;
     7 
     8 //将数字转化成八进制  返回八进制字符串 
     9 string transfer_binary(int n)
    10 {
    11     string res;
    12     string flag("0");
    13     while(true)
    14     {
    15         int i;
    16         i = n%8;
    17         n = n/8;
    18         switch(i)
    19         {
    20             case 7: res = '7' + res; break;
    21             case 6: res = '6' + res; break;
    22             case 5: res = '5' + res; break;
    23             case 4: res = '4' + res; break;
    24             case 3: res = '3' + res; break;
    25             case 2: res = '2' + res; break;
    26             case 1: res = '1' + res; break;
    27             case 0: res = '0' + res; break;
    28         }
    29         if(n==0) break;
    30     }    
    31     // 加上八进制的标志位 
    32     res = flag + res;
    33     
    34     
    35     return res;
    36 }
    37 
    38 //输出最后结果 
    39 void output_binary(int n)
    40 {
    41     cout << n << ": " << transfer_binary(n) << endl;
    42 }
    43 
    44 int main()
    45 {
    46     for(int i=0;i<=32;i++)
    47     {
    48         output_binary(i);
    49     }
    50     
    51     return 0;
    52 } 

    10进制转16进制实现:

     1 //  输出0--32的十六进制数
     2 //    非递归 
     3 
     4 #include <iostream>
     5 #include <string>
     6 using namespace std;
     7 
     8 //将数字转化成十六进制  返回十六进制字符串 
     9 string transfer_binary(int n)
    10 {
    11     string res;
    12     string flag("0x");
    13     while(true)
    14     {
    15         int i;
    16         i = n%16;
    17         n = n/16;
    18         switch(i)
    19         {
    20             case 15: res = 'F' + res; break;
    21             case 14: res = 'E' + res; break;
    22             case 13: res = 'D' + res; break;
    23             case 12: res = 'C' + res; break;
    24             case 11: res = 'B' + res; break;
    25             case 10: res = 'A' + res; break;
    26             case 9: res = '9' + res; break;
    27             case 8: res = '8' + res; break;
    28             case 7: res = '7' + res; break;
    29             case 6: res = '6' + res; break;
    30             case 5: res = '5' + res; break;
    31             case 4: res = '4' + res; break;
    32             case 3: res = '3' + res; break;
    33             case 2: res = '2' + res; break;
    34             case 1: res = '1' + res; break;
    35             case 0: res = '0' + res; break;
    36         }
    37         if(n==0) break;
    38     }    
    39     // 加上十六进制的标志位 
    40     res = flag + res;
    41     
    42     
    43     return res;
    44 }
    45 
    46 //输出最后结果 
    47 void output_binary(int n)
    48 {
    49     cout << n << ": " << transfer_binary(n) << endl;
    50 }
    51 
    52 int main()
    53 {
    54     for(int i=0;i<=32;i++)
    55     {
    56         output_binary(i);
    57     }
    58     
    59     return 0;
    60 } 

    四、上述3种转换的递归实现

    1.关于递归详细介绍:

    2.递归实现10进制转2进制

  • 相关阅读:
    python中type、object与class之间关系(一切皆对象)
    为什么在python中推荐使用多进程而不是多线程(转载)
    CPU密集型 VS IO密集型
    多CPU,多核,多进程,多线程
    Mac下brew安装与配置mysql
    mac安装navicat mysql破解版
    微信公众号-h5调用微信支付
    为什么js中0.1+0.2不等于0.3,怎样处理使之相等?(转载)
    gitlab安装和汉化
    PyPI使用国内源
  • 原文地址:https://www.cnblogs.com/wyb666/p/9153388.html
Copyright © 2011-2022 走看看