`

三十六進制之間隨便轉換

阅读更多
去年在網上給一家公司投簡歷的時候,對方要求寫一個任意進制轉換的函數,當時沒有回過神來,也不知道JAVA中有這樣的函數,呵呵。于是就自己操刀,寫了這個三十六進制之音隨便轉的函數。不過,權當練習吧,如果你不會,倒真的可以看看,學學二進制到十進制、十進制到二進制之音是如何轉何的。
/*
 程序说明:
 理论上是一个任意进制的程序,但是由于字母的有限,所有只能转换最多36进制,即0-9,a-z
 思路是:
 先将任意进制转换为10进制,再将10进制转换到任意进制
 1、任意进制转换为10进制的转换
 分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合,利用相乘相加的原则
 整数部分:(如111的二进制到十进制就是:1*pow(2,2)+1*pow(2,1)+1*pow(2,1))
 小数部分:利用相乘相加的原则
 2、10进制转换到任意进制的转换
 分别对整数和小数部分进行转换,再将分别转换后的结果进行拼合
 整数部分:利用相除取余的原则
  
 小数部分:利用相乘取整的原则
  如:原数为0.9876,转换为二进制,即每次乘2(当然这个便没有举好,有错误,能理解就行了)
  现数 余数  
  0.9752 1
  0.9504 1
  0.9008 1
  0.8016 1
  0.6032 1
  0.2064 1
  0.4128 0
*/
import java.io.*;

import java.util.*;

public class JZZH
{
  //*****************************任意进制到十进制的转换*****************************
  //任意进制到十进制的转换

  String anySystemToTen(double longNum)
    throws Exception
  {
    String strNum = String.valueOf(longNum);
    //将取得的整数部份和小数部份的进制结合在一起,并将其还原为浮点数
    //strNum=intToTenSystem(strInt,JZ)+"."+lessToTenSystem(strLess,JZ);
    return strNum;
  }
  //保证输入的数与进制相配

  boolean checkInputNumIsOK(int Num, int JZ)
  {
    if (Num <= JZ - 1)
      return true;
    else
      return false;
  }
  //由取最得的字符返回相应的数字

  String letterToInteger(String tChar)
  {
    int gotNum = 0;
    int kg = 0; //确定前面该字符是不是已经赋值,这就是使用if语句所留下的后症
    String S;
    if (tChar.equals("A"))
    {
      gotNum = 10;
      kg = 1;
    }
    else if (tChar.equals("B"))
    {
      gotNum = 11;
      kg = 1;
    }
    else if (tChar.equals("C"))
    {
      gotNum = 12;
      kg = 1;
    }
    else if (tChar.equals("D"))
    {
      gotNum = 13;
      kg = 1;
    }
    else if (tChar.equals("E"))
    {
      gotNum = 14;
      kg = 1;
    }
    else if (tChar.equals("F"))
    {
      gotNum = 15;
      kg = 1;
    }
    else if (tChar.equals("G"))
    {
      gotNum = 16;
      kg = 1;
    }
    else if (tChar.equals("H"))
    {
      gotNum = 17;
      kg = 1;
    }
    else if (tChar.equals("I"))
    {
      gotNum = 18;
      kg = 1;
    }
    else if (tChar.equals("J"))
    {
      gotNum = 19;
      kg = 1;
    }
    else if (tChar.equals("K"))
    {
      gotNum = 20;
      kg = 1;
    }
    else if (tChar.equals("L"))
    {
      gotNum = 21;
      kg = 1;
    }
    else if (tChar.equals("M"))
    {
      gotNum = 22;
      kg = 1;
    }
    else if (tChar.equals("O"))
    {
      gotNum = 23;
      kg = 1;
    }
    else if (tChar.equals("P"))
    {
      gotNum = 24;
      kg = 1;
    }
    else if (tChar.equals("Q"))
    {
      gotNum = 25;
      kg = 1;
    }
    else if (tChar.equals("R"))
    {
      gotNum = 26;
      kg = 1;
    }
    else if (tChar.equals("S"))
    {
      gotNum = 27;
      kg = 1;
    }
    else if (tChar.equals("T"))
    {
      gotNum = 28;
      kg = 1;
    }
    else if (tChar.equals("U"))
    {
      gotNum = 29;
      kg = 1;
    }
    else if (tChar.equals("V"))
    {
      gotNum = 30;
      kg = 1;
    }
    else if (tChar.equals("W"))
    {
      gotNum = 31;
      kg = 1;
    }
    else if (tChar.equals("X"))
    {
      gotNum = 32;
      kg = 1;
    }
    else if (tChar.equals("Y"))
    {
      gotNum = 33;
      kg = 1;
    }
    else if (tChar.equals("Z"))
    {
      gotNum = 34;
      kg = 1;
    }
    else if (kg == 0)
    {
      gotNum = Integer.parseInt(tChar);
    }
    S = String.valueOf(gotNum);
    return S;
  }

  //浮点数的整数部份转换为十进制

  String intToTenSystem(String strNum, int JZ)
    throws Exception
  {
    strNum = strNum.toUpperCase(); //全部转换为大写,方便字符到数字的转换  
    double longNum = 0;
    int len = strNum.length(); //取得字符串的长度
    int tInt = 0; //初使化数组位置为0
    int gotNum = 0; //一个一个字符取出所对应的数字
    while (len > 0)
    { //如果没有将字符串的字符转换完,就继续   
      String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
      gotNum = Integer.parseInt(letterToInteger(tChar));
      if (!checkInputNumIsOK(gotNum, JZ))
      {
        System.out.println("你的输入与转换的进制不符,请检查!");
        System.exit(-1);
      }

      longNum = longNum + gotNum * (Math.pow(JZ, len - 1));
      tInt++;
      len--;

    }
    return String.valueOf(longNum);
  }
  //浮点数小数部份转换为十进制

  String lessToTenSystem(String strNum, int JZ)
    throws Exception
  {
    strNum = strNum.toUpperCase();
    double longNum = 0;
    int len = strNum.length(); //取得字符的长度
    int tInt = 0; //取第tInt个字符
    int gotNum = 0; //取出的字符转换为数字
    int cfInt = -1; //多少次次方
    while (len > 0)
    {
      String tChar = strNum.substring(tInt, tInt + 1); //一个一个字符的取
      gotNum = Integer.parseInt(letterToInteger(tChar));
      if (!checkInputNumIsOK(gotNum, JZ))
      {
        System.out.println("你的输入与转换的进制不符,请检查!");
        System.exit(-1);
      }
      //保存出小数部份从对应的进制到十进制的总值
      longNum = longNum + gotNum * (Math.pow(JZ, cfInt)); //关键算法
      tInt++; //字符串中位置加一
      len--; //字符串总长度减一
      cfInt--;
    }
    return String.valueOf(longNum);
  }
  //返回一个浮点数的整数或者是小数部份

  String returnWantPart(String doubleNum, String whichPart)
    throws Exception
  {
    String strNum = doubleNum;
    String leftStr;
    String rightStr;
    //如果输入的是一个浮点数
    if (strNum.indexOf(".") != -1)
    {
      StringTokenizer fenxi = new StringTokenizer(strNum, ".");
      leftStr = fenxi.nextToken();
      rightStr = fenxi.nextToken();
    }
    else
    { //如果输入的是一个整数
      leftStr = strNum;
      rightStr = "0";
    }
    String returnStr = "";
    if (whichPart.equals("left"))
      returnStr = leftStr;
    else if (whichPart.equals("right"))
      returnStr = rightStr;
    return returnStr;
  }
  //*****************************任意进制到十进制的转换*****************************
  //*****************************十进制到任意进制的转换***************************** 

  String tenToAnySystem_Int(String strInt, int JZ)
  { //因为由任意进制到十进制的转换结果为"整数部分.小数部份"
    //也就是分成整数和小数部份分别转换
    //此函数完成的功能是十进制的整数部分到任意进制的转换  
    try
    {
      //取出整数部份 
      strInt = returnWantPart(strInt, "left");
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    long intStr = Long.parseLong(strInt);
    long[] result = new long[50]; //用50个数组来保存相除的余数
    long T;
    String resultStr = "";
    int i = 0; //数组的下标
    while (intStr != 0)
    {
      result[i] = intStr % JZ; //取出余数
      intStr = intStr - result[i]; //现数为减去余数的数
      intStr = intStr / JZ;
      i++; //数组下标增加一
    }
    //将数组全部反序排列,并返回结果
    for (int j1 = 0, j2 = i - 1; j1 < (i / 2); j1++, j2--)
    {
      T = result[j1];
      result[j1] = result[j2];
      result[j2] = T;
    }
    for (int j = 0; j < i; j++)
    {
      resultStr = resultStr + intToLetter(result[j]);

    }
    return resultStr;

  }
  //此函数完成的功能是十进制的小数部分到任意进制的转换

  String temToAnySystem_Less(String strLess, int JZ)
  {
    double T = 0;
    T = Double.parseDouble(strLess);
    String resultStr = "";
    String strInt = "";
    //精度取到小数点后面6位为止
    int JinDu = 0;
    int i = 0; //数组下标  
    int[] result = new int[50];
    for (int j = 0; j < 50; j++) //将数组初使化
      result[j] = 0;
    try
    {
      while (JinDu <= 6 && T > 0.000001)
      {
        double tNum = 0;
        tNum = T * JZ;
        if (tNum > 1)
        { //取出整数部份
          try
          {
            strInt = returnWantPart(String.valueOf(tNum), "left");
          }
          catch (Exception e)
          {
            e.printStackTrace();
          }
          result[i] = Integer.parseInt(strInt);
          T = tNum - result[i]; //将当前数减去取出来的数
        }
        else
        {
          //如果整数小于零,那么整数部分就是0
          result[i] = 0;
        }
        JinDu++;
        i++;

      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    for (int j = 0; j < i; j++)
      resultStr = resultStr + String.valueOf(result[j]);
    if (i == 0)
      return "0";
    else
      return resultStr;

  }
  //将取得的数字转换为相应的字母

  String intToLetter(long num)
  {
    String result = "";
    String S = "";
    if (0 <= num && num <= 9)
      result = String.valueOf(num);
    else if (num > 9)
    {
      S = String.valueOf(num); //将长整型转换为字符串型
      switch (Integer.parseInt(S)) //将字符串型转换为整型
      {
        case 10:
          result = "A";
          break;
        case 11:
          result = "B";
          break;
        case 12:
          result = "C";
          break;
        case 13:
          result = "D";
          break;
        case 14:
          result = "E";
          break;
        case 15:
          result = "F";
          break;
        case 16:
          result = "G";
          break;
        case 17:
          result = "H";
          break;
        case 18:
          result = "I";
          break;
        case 19:
          result = "G";
          break;
        case 20:
          result = "K";
          break;
        case 21:
          result = "L";
          break;
        case 22:
          result = "M";
          break;
        case 23:
          result = "N";
          break;
        case 24:
          result = "O";
          break;
        case 25:
          result = "P";
          break;
        case 26:
          result = "Q";
          break;
        case 27:
          result = "R";
          break;
        case 28:
          result = "S";
          break;
        case 29:
          result = "T";
          break;
        case 30:
          result = "U";
          break;
        case 31:
          result = "V";
          break;
        case 32:
          result = "W";
          break;
        case 33:
          result = "X";
          break;
        case 34:
          result = "Y";
          break;
        case 35:
          result = "Z";
          break;
      }
    }
    return result;
  }
  //*****************************十进制到任意进制的转换*****************************

  public static void main(String[] arg)
    throws Exception
  {
    try
    {
      JZZH jzzh = new JZZH();
      BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));
      String inData = " ";

      while (!inData.toUpperCase().equals("QUIT"))
      {
        System.out.print("请输入一个数(quit退出)(格式:原数,原数进制,要转换到的进制):");
        inData = br.readLine();
        if (inData.equals("") || inData.equals(" "))
          continue;
        if (inData.toUpperCase().equals("QUIT"))
          break;
        StringTokenizer fenxi = new StringTokenizer(inData, ",");
        String tData = fenxi.nextToken(); //取出原数
        //String whichPart=
        //System.out.println("The Result is :"+tData);
        int whichSystem = Integer.parseInt(fenxi.nextToken()); //取出原进制
        int targetSystem = Integer.parseInt(fenxi.nextToken()); //取出要转换的进制
        String returnLeftPart; //输入数的整数部分
        String returnRightPart; //输入数的小数部分
        //分别取出数的左面和右面
        returnLeftPart = jzzh.returnWantPart(tData, "left"); //取出输入数的整数部分
        returnRightPart = jzzh.returnWantPart(tData, "right"); //取出输入数的小数部分

        String anyChangedToIntSystem; //用于接收输入数的整数部分转换后的结果
        String anyChangedToLessSystem; //用于接收输入数的小数部分转换后的结果
        anyChangedToIntSystem =
            jzzh.intToTenSystem(returnLeftPart, whichSystem);
        anyChangedToLessSystem =
            jzzh.lessToTenSystem(returnRightPart, whichSystem);

        double leftNum = Double.parseDouble(anyChangedToIntSystem);
        double rightNum = Double.parseDouble(anyChangedToLessSystem);
        double totalNum = leftNum + rightNum; //拼合结果
        System.out.println(tData + "由" + whichSystem + "到10进制的结果是:" +
                           jzzh.anySystemToTen(totalNum));

        //十进制到任意进制的转换temToAnySystem_Less
        String tenChangedToAnySystemInt = "";
        String tenChangedToAnySystemLess = "";
        tenChangedToAnySystemInt =
            jzzh.tenToAnySystem_Int(anyChangedToIntSystem, targetSystem);
        tenChangedToAnySystemLess =
            jzzh.temToAnySystem_Less(anyChangedToLessSystem, targetSystem);
        System.out.println(tData + "由" + whichSystem + "到" + targetSystem +
                           "进制的结果是:" + tenChangedToAnySystemInt + "." +
                           tenChangedToAnySystemLess);

      }
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}
分享到:
评论

相关推荐

    C#学习例子

    小小计算器相对于Windows自带的其优点在于二进制/八进制/十六进制之间可以任意多位数等价转换,而Windows自带的有位数的限制;里面的值得一提的是算法,不足之处是从十进制转换为其它进制时,最大数为10的15次方减1...

    《计算机基础》全套PPT电子课件教案-第一章-计算机基础知识.ppt

    三、各种进制数的转换数制之间的转换是通过特定算法完成的。例如,将二进制转换为十进制,可以采用累加权值的方法;将十进制转换为二进制,通常使用除2取余法;八进制和十六进制转换至二进制或十进制,也可以通过...

    大学计算机考试答案.pdf

    例如,十进制数100转换为二进制是01100100,转换为八进制是144,转换为十六进制是64。 4. **计算机应用领域**:资料检索属于数据处理,这是计算机应用的一种,还包括科学计算、实时控制和人工智能等。 5. **编程...

    学计算机基础期末复习题.doc

    2. 二进制 11101111 转换成十六进制数:77。 3. 十进制数 178.75 对应的二进制数:10110010.11。 4. 一个字节由 8 个二进制位形成。 5. 原码表示中,用 1 位表示正负号,一个字节能表示的最大有标记数:127。 6. ...

    2021-2022计算机二级等级考试试题及答案No.13046.docx

    17. **十进制到二进制的转换**:十进制数58转换成二进制数是(111010),这一转换过程是正确的(正确答案:正确)。 ### 计算机硬件历史 18. **硬件巨头“蓝色巨人”**:“蓝色巨人”通常指的是IBM公司(选项A),它...

    专升本计算机基础复习资料.doc

    - 数制:包括十进制、二进制、十六进制、八进制等,它们之间可以相互转换 - 码制:用于表示字符,如ASCII码、Unicode码等 - 汉字编码:包括字形、字音、音形、数字编码等多种方案 6. **计算机中信息的单位** - ...

    高中信息技术会考试题网络部分含答案.doc

    每个IP地址段由8位二进制组成,转换为十进制后范围是0到255。 17. 错误的IP地址表述:IP地址可以随便指定。IP地址必须唯一且遵守分配规则。 18. 子网掩码255.255.255.0允许的终端数量:254台。除去网络地址和广播...

    职称计算机Windows XP考试试题(三).docx

    2. **硬件配置与性能**:第十七题涉及计算机硬件配置与性能之间的关系。正确选项是**D.在微型计算机性能指标中,CPU的主频越高,其运算速度越快**。主频越高意味着CPU执行指令的速度越快。 ### 六、外存储设备与内...

    06年计算机职称考试模拟题.doc

    - 不同进制之间的数值比较需要转换到同一进制下进行。 - 此题答案为(D),即十进制的1789最大。 #### 8. 启动DOS系统 - 实际上是将DOS系统加载到内存中,并使之处于运行状态。 #### 9. 内部命令 - 内部命令是DOS...

    四年级数学下册教材梳理数与代数4小数的意义和性质新人教版

    - 小数是十进制分数的另一种表达,方便计算和理解。 2. **小数的计数单位**: - 小数的计数单位包括十分之一(0.1)、百分之一(0.01)、千分之一(0.001)等,每个计数单位之间的进率是10。 3. **小数的读法和...

    计算机基础知识参考试题及答案解析(20211011033544).pdf

    2. **ASCII码**: ASCII码是一种字符编码标准,用于将字符转换为数字,便于计算机处理。ASCII码表按照特定顺序排列,包括控制字符、数字符、大写英文字母和小写英文字母。 3. **指令系统**: 指令是计算机执行的基本...

    js压缩图片,js图片base64压缩上传

    在这个函数中,`maxWidth`和`maxHeight`定义了允许的最大尺寸,`quality`参数用于控制JPEG的压缩质量,范围通常在0.1到1之间,值越小质量越低,文件也越小。 在实际应用中,我们可能需要处理多个图片,这时可以使用...

    c语言试题及答案 里面包含了常见的考题和答案

    1. 字节(Byte)是计算机存储的基本单位,通常一个字节包含8个二进制位(bits),即选项C正确。 2. 高级语言编写的源程序需要经过编译才能被计算机执行。编译程序(Compiler)将源代码转换为目标代码,而汇编程序...

    Linux操作系统基础教程

    三.如何得到Linux?.............................................................................................................3 四.如何得到Linux的最新消息?...........................................

    WINCVS和CVSNT安装包

    三部分之间使用冒号“:”来进行分割。 用户名:就是登陆CVS的用户名 密 码:用户的密码,这里是经过加密的,如果为空,那么就是空密码 本地用户:CVS用户这个别名对应的本地用户,(跟本地用户没有任何其 他...

    网管教程 从入门到精通软件篇.txt

    BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 BUN:CakeWalk 声音...

    如何编写批处理文件批处理文件批处理文件

    标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 4.Rem 命令 注释...

Global site tag (gtag.js) - Google Analytics