C语言 | 进制转换

 

 

前言

进制转换有如下几种常见情况:

  • 十进制转换为其他进制

  • 其他进制转换为十进制

  • 二进制转换为其他进制

  • 八进制转换为其他进制

  • 十六进制转换为其他进制

 

十进制转换为其他进制

十进制转其他进制:取余法。下面以十进制转二进制为例,请看下图:

所以十进制105对应的二进制数为1101001,即最后一个余数写在前面,以此类推写到最后一个余数。同样的,十进制数转换为其他进制数也遵循这样的规则。

由此可设计出如下函数:

int deci_to_other_scale(uint deci_num, int scale, char s[])
{
  static char ch[] = "0123456789ABCDEF";
  char buf[N + 1];
  int i = N, j;
  
  if ( !(scale >= 2 && scale <= 16) )
  {
    s[0] = '\0';
    return 0;
  }

  buf[N] = '\0';
  do
  {
    buf[--i] = ch[deci_num%scale];
    deci_num /= scale;
  }while(deci_num);
  
  for ( j = 0; j < N-1; j++ )//for ( j = 0; (s[j] = buf[i])!='\0'; i++, j++ );
  {
    s[j] = buf[i];
    i++;
  }
  
  return j;
}

定义一个数组buf,用于保存余数,数组最后一个元素保存第一个余数,倒数第二个元素保存第二个余数,依次类推。

然后再把数组buf的元素值依次赋给函数的形参s[],这里把形参s[]称为输出参数,因为这个参数可以把函数内的数据带到该函数外使用。

 

其他进制转换为十进制

以八进制数转化为十进制数为例。如下图:

所以其他进制转换为十进制,首先需要分离出该进制数的各位数,再按权展开,相加即得十进制数。

由此可设计出如下函数:

/*
  如八进制776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510
*/
int other_scale_to_deci(char *other_num, int scale)
{
  const char figure[] = "0123456789ABCDEF";
  
  char i, j;
  char other_len = strlen(other_num), figure_len = strlen(figure);
  char deci_num[other_len];
  int deci_sum = 0;
  char flag = 0;

  /* 分离scale进制数的各位,如八进制776分离成7,7,6 */
  for ( i = 0; i < other_len; i++ )
  {
    for ( j = 0; j < scale; j++ )
    {
      if ( other_num[i] == figure[j] )
      {
        deci_num[i] = j;  
        flag = 1;
      }
      
    }
    /* 不是scale进制数则退出函数 */
    if(flag == 0)
    {
      printf("Input Error!Please Input Again!\n");
       return 0;
    }
    flag = 0;
    
  }

  /* scale进制转化为十进制,如八进制转换为十进制数:776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510 */
  for ( i = 0; i < other_len; i++ )
  {
    deci_sum += deci_num[other_len-1-i]*pow(scale, i);
  }

  return deci_sum;
}

 

二进制转换为其他进制

二进制转换为其他进制:先把二进制转化为十进制数,十进制数再转化为其他进制数。(可调用以上两个函数完成)

可设计如下函数:

int binary_to_other_scale(char *binary_num, int scale, char s[])
{
  int deci_sum = 0;

  deci_sum = other_scale_to_deci(binary_num, TWO_SCALE);

  return deci_to_other_scale(deci_sum, scale, s);
}

 

八进制转换为其他进制

八进制转换为其他进制:先把八进制转化为十进制数,十进制数再转化为其他进制数。

可设计如下函数:

int oct_to_other_scale(char *oct_num, int scale, char s[])
{
  int deci_sum = 0;

  deci_sum = other_scale_to_deci(oct_num, EIGHT_SCALE);

  return deci_to_other_scale(deci_sum, scale, s);
}

 

十六进制转换为其他进制

十六进制转换为其他进制:先把十六进制转化为十进制数,十进制数再转化为其他进制数。

可设计如下函数:

int hex_to_other_scale(char *hex_num, int scale, char s[])
{
  int deci_sum = 0;

  deci_sum = other_scale_to_deci(hex_num, SIXTEEN_SCALE);
  
  return deci_to_other_scale(deci_sum, scale, s);
}

以上就是各进制之间的转换函数。核心函数为:“十进制转换为其他进制”与“其他进制转换为十进制”。其他函数都是根据这两个函数设计的。程序测试范例结果如下:

完整程序提供测试函数。获取完整程序的方法:关注微信公众号【嵌入式大杂烩】,并在公众号回复关键字进制转换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值