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

检索词:

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

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

一、英文先行

  • 英文中文缩写标识符
    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 <stdio.h>
    #include <string.h>
    #include<cstdlib>
    
    
    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;
    }
    
  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 <stdio.h>
    #include<stdlib.h>
    
    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;
    }
    
  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. 二者时间消耗几乎一致

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值