• 进制转换算法(通用,极简)


    检索词:

    ​ 进制转换、通用进制转换、二进制转十进制、二进制转八进制、二进制转十六进制、

    ​ 十进制转二进制、十六进制转二进制、八进制转二进制、通用算法、字符型输入输出

    一、英文先行

    • 英文中文缩写标识符
      Binary二进制Bin/B
      Octal八进制OCT/O%o—(无符号8进制整数(不输出前缀0))
      Decimal十进制DEC/D%u—(无符号10进制整数) AND %d—(整数/有符号)
      hexadecimal十六进制HEX/H%x/X—(无符号,x对应小写,X对应大写(不输出前缀0x))
      system进制
      conversion转换
      malloc分配内存

    二、自定义函数—SystemConversion()

    1. 输入参数说明
      函数输入数据类型含义
      inchar*源数据
      s_inint源数据的进制
      s_outint目标数据的进制
    2. 内部定义参数说明
      变量名称参数类型参数含
      nint临时循环量
      outchar*用于保存目标数据
      decint转换时的中间值
      outLengthint★目标数据的长度(自行尝试不同取值,影响输出结果)
    3. 返回值说明
      函数返回值类型返回值含义
      char*转换后的结果
    4. 源代码

      #include 
      #include 
      #include
      
      
      char* SystemConversion(char *in,int s_in,int s_out)
      {
         char *out=(char*)malloc(sizeof(char));
         int n,dec=0; 
         int outLength=512; 
         for(char *p=in;*p;p++)
         		dec=dec*s_in+(*p-((*p>='a')?('a'-10):'0'));
         for(n=outLength-1;dec&&n;dec=dec/s_out)
         		out[n--]=(dec%s_out)+(((dec%s_out)<10)?'0':('a'-10));
         memmove(out,out+n+1,outLength-n-1);
         out[outLength-n-1]=0;   
         return out;
      }
      
      int main()
      {	
         for(int i=2;i<=36;i++)
          printf("转换为%d进制结果:%s\n",i,SystemConversion("1024",10,i));
         return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    5. 【运行结果】
      在这里插入图片描述


    四、库函数—itoa()

    1. itoa()函数介绍

      **char itoa( int value, char string,int radix);

      参数说明:
      value:欲转换的数据。
      string:目标字符串的地址。
      radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。

      功能:

      将整数value 转换成字符串存入string 指向的内存空间 ,radix 为转换时所用基数(保存到字符串中的数据的进制基数)。

      返回值:

      函数返回一个指向 str,无错误返回。

    2. itoa()函数实例:
      #include 
      #include
      
      int main()
      {
      	char a[100]={0};
      	for(int i=2;i<=36;i++)
      	{
      		itoa(1024,a,i);
      		printf("转换为%d进制结果:%s\n",i,a);
      	}
      	return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    3. 运行结果

      在这里插入图片描述


    五、需求拓展

    1. 类型转换
      源类型目标类型转换方法
      intchar0+‘0’
      char*stringstring s; char* p =“hello”; s = p;直接赋值
      charint‘0’-‘0’
      stringchar*char ch[20]; string s=“123456”; strcpy(ch,s.c_str());
    2. C语言 单引号和双引号的区别
      1. 含义不同

        用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此’s’的含义其实和十进制数115的含义是一致的。而用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针。

      2. 大小不同

        用单引号引起的一个字符大小就是一个字节。而用双引号引起的字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符’\0’。


    六、分析

    1. 自定义函数

      • 优点
        1. 大部分转换算法都可满足
        2. 易于直接使用
        3. 可用于学习思考
      • 缺点
        1. 无输入异常反馈机制(即无法判断源数据是否满足源数据的进制),需要自己实现
        2. 因该算法为进制转换通用算法,相对某种具体转换为非最优解
    2. 库函数

      调个库,一行解决不方便吗?

    3. 二者时间消耗几乎一致

  • 相关阅读:
    蛋白质致病突变的计算方法(二)
    linux系统Jenkins工具web配置
    QQ云端机器人登录系统php源码开心版
    数据结构之“刷链表题”
    mongoDB副本集
    网络安全等级保护2.0详解
    LeetCode 面试题 02.08. 环路检测
    撤销git 命令
    装饰器模式
    元数据性能大比拼:HDFS vs S3 vs JuiceFS
  • 原文地址:https://blog.csdn.net/iDJ77/article/details/127632667