浮点数的任意进制之间的转换

#include <stdio.h>
#include <string.h>

void main(){
  int input, output, i = 0, j = 0, integer = 0, position = 0, length_of_integer = 0, decimal_integer = 0;
  double decimal = 0;
  char origin[51] = {0}, final[51] = {0};

  printf("请输入原数据的进制类型:\n");
  scanf("%d", &input);
  printf("请输入你要转换的数据:\n");
  scanf("%s", origin);
  printf("请输入你要转换成的进制类型:\n");
  scanf("%d", &output);

  printf("转换成的%d进制数为:\n", output);

  while(origin[position] != '.' && position < 50){  //寻找小数点的位置,分离整数小数
    position++;
  }

  if(origin[position] == '.'){
    for(i = 0; i < position; i++){            //转化整数部分,先转化为十进制数,再进行其他进制转换
      integer = integer*input;
      if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
        integer = integer + (origin[i] - 'A' + 10);
      }
      else{
        integer = integer + (origin[i] - '0');
      }
    }

    for(i = strlen(origin) - 1; i > position; i--){      //转化小数部分,先转换为十进制数,再进行其他进制转换
      if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
        decimal = decimal + (origin[i] - 'A' + 10);
      }
      else{
        decimal = decimal + (origin[i] - '0');
      }
      decimal = decimal/input;
    }
  }
  else{
    for(i = 0; i < strlen(origin); i++){      //如果不是小数,先转换为十进制数,再进行其他进制转换
      integer = integer*input;
      if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
        integer = integer + (origin[i] - 'A' + 10);
      }
      else{
        integer = integer + (origin[i] - '0');
      }
    }
  }

  if(integer == 0){       //单独判断一下整数部分是否为0,如果是,则单独处理
    final[j] = '0';
    j++;
    length_of_integer++;
  }
  while(integer){                //整数部分从十进制转化成其他进制
    if(integer%output > 9){
      final[j] = 'A' - 10 + integer%output;
    }
    else{
      final[j] = integer%output + '0';
    }
    integer = integer/output;
    j++;
    length_of_integer++;
  }

  while(j <= 50 && decimal != 0.0){               //小数部分从十进制转换成其他进制
    decimal_integer = decimal*output;
    if(decimal*output > 9){
      final[j] = 'A' - 10 + decimal_integer;
    }
    else{
      final[j] = decimal_integer + '0';
    }
    decimal = decimal*output - decimal_integer;
    j++;
  }

  for(i = length_of_integer - 1; i >= 0; i--){     //输出整数部分
      printf("%c", final[i]);
  }
  if(origin[position] == '.'){      //如果是小数
    printf(".");
  	for(i = length_of_integer; i < j; i++){     //挨个输出小数字符数字
    printf("%c", final[i]);
  	}
  }
}

  1. 总体思路:先将其他进制数据转化为十进制,再将数据转化为其他进制,间接实现任意进制之间的转换。
  2. 在转换过程中,以小数点为界限,分隔整数和小数
  3. 为了便于输入输出,采取字符串的形式
  4. 对于整数部分,如果是k进制的数,化成10进制,则从最高位开始,不断×k,最高位实现累乘,能够得到每一位都×自己对应的次数。注意:最低位×k^0即1,故要在循环中,先写integer = integer * input(参考代码第24行)。而10进制的整数化为m进制,则不断进行求余和除法运算,实现余数的收集,然后倒序排列,即为m进制的整数部分。(实际上是k进制化为10进制的逆运算)。
  5. 对于小数部分,请注意:小数的k进制化为10进制,需要从最低位开始不断÷k,从而实现每位小数都÷相应的k次方,实现小数部分化为10进制小数,需要注意的是,最高位小数÷k^1,故要在循环中,后写decimal = decimal / output(参考代码第40行)。而当十进制小数化为m进制小数时,需要不断进行×m取整,原因是,m进制小数的每一位÷相应位数的m次方得到10进制小数,那么想要得到m进制小数的每一位,就要×m不断取整得到(两者其实互为逆运算)
  6. 最后看好整数部分和小数部分所占据的输出数组的位置输出即可,注意在其中间单独输出一个小数点即可。
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在WinForm应用程序中,将十六转换为单精度点数需要一些数学运算和代码实现。这里提供一种简单的实现方法。 首先,将十六字符串转换为整数。可以使用int.Parse或Convert.ToInt32方法,或者使用自定义的十六转换方法。 然后,将整数转换为单精度点数。单精度点数的32位二表示分为三个部分:符号位、指数位、尾数位。其中,符号位为1位、指数位为8位、尾数位为23位。 根据IEEE 754标准,单精度点数的表示方法为:(-1)^s x (1+f) x 2^(e-127),其中s为符号位、f为尾数位转换的十数、e为指数位转换的十数。 具体实现过程如下: 1. 将十六字符串转换为整数。 string hexString = "42f6e980"; //示例十六字符串 int intValue = Convert.ToInt32(hexString, 16); 2. 将整数转换为单精度点数。 int signBit = intValue >> 31; //取符号位 int exp = (intValue >> 23) & 0xff; //取指数位 int frac = intValue & 0x7fffff; //取尾数位 float result = Mathf.Pow(-1, signBit) * (1 + frac / Mathf.Pow(2, 23)) * Mathf.Pow(2, exp - 127); 需要注意的是,在Unity中使用C#编程时,需要使用Mathf.Pow函数代替Math.Pow函数点数幂运算。 以上就是将十六转换为单精度点数的简单实现方法。如果需要更详细或更高效的实现,可以参考IEEE 754标准及其他代码实现方法。 ### 回答2: Winform 十六转单精度点数的实现方法如下: 首先我们需要了解单精度点数的二表示方法。单精度点数共32位,符号位占1位,指数位占8位,尾数位占23位,其中指数位用偏移值表示,即实际指数值等于指数位的二值减去127。 而十六数可以直接转换为二数,每个十六位对应4个二位。因此,我们可以将十六转换为32位的二数后,分别取符号位、指数位和尾数位,按照上述方法转换为单精度点数的十表示。 下面是代码实现: ``` private float HexToFloat(string hex) { int raw = Convert.ToInt32(hex, 16); byte[] floatVals = BitConverter.GetBytes(raw); float result = BitConverter.ToSingle(floatVals, 0); return result; } ``` 首先将十六字符串转换为整型值 `raw`,然后使用 `BitConverter` 类的 `GetBytes()` 方法将 `raw` 转换为字节数组 `floatVals`,最后使用 `BitConverter` 类的 `ToSingle()` 方法将 `floatVals` 转换为单精度点数的十表示值 `result`。 使用该方法,我们可以将任意十六转换为单精度点数。例如,将十六数 `3f800000` 转换为单精度点数的十表示值为 1.0。 ### 回答3: WinForm 是 Microsoft 提供的一种图形用户界面开发框架,可用于开发 Windows 应用程序。而十六转单精度点数,则是一种数字处理方法,将十六转换为单精度点数。 在 WinForm 中,我们可以使用 C# 语言编写程序实现这种转换。首先,我们需要定义一个文本框来输入十六数,一个按钮来触发转换,另外还需要一个文本框来显示结果。 当用户点击转换按钮时,程序会首先读取用户在输入框中输入的十六数,然后将其转换为十数。接着,我们需要将这个十转换为单精度点数,这可以使用 BitConverter 类的 ToSingle 函数来实现。最后,我们将转换后的单精度点数显示在输出文本框中,即完成了十六转单精度点数的过程。 下面是一个简单的示例代码: ``` private void btnConvert_Click(object sender, EventArgs e) { string hex = txtHex.Text; int dec = Convert.ToInt32(hex, 16); float f = BitConverter.ToSingle(BitConverter.GetBytes(dec), 0); txtFloat.Text = f.ToString(); } ``` 需要注意的是,在转换十六数为十数时,我们使用了 Convert.ToInt32 函数。这个函数会将输入的字符串转换为 32 位有符号整数,而单精度点数也是 32 位的,因此可以使用 BitConverter.ToSingle 函数将整数转换点数。 以上就是使用 WinForm 实现十六转单精度点数的一个简单方法。当然,实际应用中还需要考虑错误处理、界面设计等多种因素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值