任意进制的转换(二)

简介: 任意进制的转换(二)

一. 进制转换


除了常见的十进制,二进制,八进制,十六进制(A ~ F或者a~f)之外,可以继续往上扩展,即加上H ~ Z ,那么一共就有26+10=36 个值了,再大,就没有合适的值来表示了。(当然,也有说用+ - / 这样的特殊字符串来表示的).


二. 十进制转换成其他的进制

20190411195558969.png

20190411195525701.png


提前定义好进制范围


private static String SCALE_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  private static char [] SCALE_ARRAY="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();


利用栈 Stack 来反向输出数据。


/*十进制转换成其他的进制*/
  public static String ten_to_other(int num,int base){
    /*1.先对这个数字进行相应的判断*/
    if(num==0){
      return "0";
    }
    /*2.对要转换成的基本进制进行转换*/
    if(base<=1||base>=37){ //最大进制理论上是,26字母+10数字=36个。
      return "0";
    }
    if(base==10){ //与原先的进制一样,那么就不需要进行相应的转换了。
      return String.valueOf(num);
    }
    /*条件判断完成了,就需要进行真正的转换操作了。*/
    Stack<Character> result=new Stack<Character>(); //用栈表示。
    while(num>0){ //当数字大于0时。
      result.add(SCALE_ARRAY[num%base]);
      num=num/base;
    }
    //用一个字符串进行相应的接收吧。
    StringBuilder stringBuilder=new StringBuilder(0);
    //全部放入到栈中,开始进行相应的出栈操作了。
    for (;!result.isEmpty();) {
      stringBuilder.append(result.pop());
    }
    return stringBuilder.length()==0?"0":stringBuilder.toString();
  }


三. 其他进制转换成十进制


20190411195647487.png


20190411195715935.png


// 需要重载
  public static int other_to_ten(int num,int base){
    return other_to_ten(String.valueOf(num), base);
  }
  /*其他进制转换成十进制*/
  public static int other_to_ten(String num,int base){
    /*1.先对这个数字进行相应的判断*/
    if("0".equals(num)){
      return 0;
    }
    /*2.对要转换成的基本进制进行转换*/
    if(base<=1||base>=37){ //最大进制理论上是,26字母+10数字=36个。
      return 0;
    }
    if(base==10){ //与要转换的进制一样,那么就不需要进行相应的转换了。
      return Integer.valueOf(num);
    }
    /*开始进行真正的操作了。*/
    char numArray[]=num.toCharArray(); //转换成char数组,方便给每一个值进行转换。
    int result=0;
    int n=1; //要乘的基数
    for (int i =numArray.length-1; i>=0; i--) {
      int index=SCALE_STRING.indexOf(numArray[i]); //取出对应的那个索引值,即那个数字值。
      result+=index*n;
      n*=base;
    }
    return result;
  }


四. 其他进制转换成其他进制


//原先的进制可能 小于10,但转换后的可能大于10,也可能 小于10,所以统一成字符串比较好一点。
  public static String other_to_other(int num,int base,int toBase){
    return other_to_other(String.valueOf(num), base, toBase);
  }
  //原先的进制可能大于10
  public static String other_to_other(String num,int base,int toBase){
    if("0".equals(num)){
      return "0";
    }
    if((base<=1||base>=37)||(toBase<=1||toBase>=37)){ //最大进制理论上是,26字母+10数字=36个。
      return "0";
    }
    if(base==toBase){
      return num;
    }
    int temp=other_to_ten(num, base);
    return ten_to_other(temp, toBase);
  }


五. 提前定义常用的方法


为了更好的方便,二进制,八进制,十进制,十六进制之间的转换,可以提供这些常见的转换方法


//十进制转换成二进制
  public static int toBinary(int num){
    return Integer.valueOf(other_to_other(num,10,2));
  }
  //十进制转换八进制
  public static int toOct(int num){
    return Integer.valueOf(other_to_other(num,10,8));
  }
  //十进制转换成十六进制
  public static int toOx(int num){
    return Integer.valueOf(other_to_other(num,10,16));
  }
  // 二进制转换成十进制
  public static int binaryToTen(int num){
    return Integer.valueOf(other_to_other(num,2,10));
  }
  // 八进制转换成十进制
  public static int OctToTen(int num){
    return Integer.valueOf(other_to_other(num,8,10));
  }
  // 十六进制转换成十进制
  public static int OxToTen(String num){
    return Integer.valueOf(other_to_other(num,16,10));
  }


六. 统一整理


所以,将以上的方法结合起来,就是完整的实例


public class  Transfer{
  private static String SCALE_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  private static char [] SCALE_ARRAY="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  /*十进制转换成其他的进制*/
  private static String ten_to_other(int num,int base){
    if(base==10){ //与原先的进制一样,那么就不需要进行相应的转换了。
      return String.valueOf(num);
    }
    /*条件判断完成了,就需要进行真正的转换操作了。*/
    Stack<Character> result=new Stack<Character>(); //用栈表示。
    while(num>0){ //当数字大于0时。
      result.add(SCALE_ARRAY[num%base]);
      num=num/base;
    }
    //用一个字符串进行相应的接收吧。
    StringBuilder stringBuilder=new StringBuilder(0);
    //全部放入到栈中,开始进行相应的出栈操作了。
    for (;!result.isEmpty();) {
      stringBuilder.append(result.pop());
    }
    return stringBuilder.length()==0?"0":stringBuilder.toString();
  }
  public static int other_to_ten(int num,int base){
    return other_to_ten(String.valueOf(num), base);
  }
  /*其他进制转换成十进制*/
  private static int other_to_ten(String num,int base){
    if(base==10){ //与要转换的进制一样,那么就不需要进行相应的转换了。
      return Integer.valueOf(num);
    }
    /*开始进行真正的操作了。*/
    char numArray[]=String.valueOf(num).toCharArray(); //转换成char数组,方便给每一个值进行转换。
    int result=0;
    int n=1; //要乘的基数
    for (int i =numArray.length-1; i>=0; i--) {
      int index=SCALE_STRING.indexOf(numArray[i]); //取出对应的那个索引值。
      result+=index*n;
      n*=base;
    }
    return result;
  }
  //原先的进制可能 小于10,但转换后的可能大于10,也可能 小于10,所以统一成字符串比较好一点。
  public static String other_to_other(int num,int base,int toBase){
    return other_to_other(String.valueOf(num), base, toBase);
  }
  //原先的进制可能大于10
  private static String other_to_other(String num,int base,int toBase){
    if("0".equals(num)){
      return "0";
    }
    if((base<2||base>36)||(toBase<2||toBase>36)){ //最大进制理论上是,26字母+10数字=36个。
      return "0";
    }
    if(base==toBase){
      return num;
    }
    int temp=other_to_ten(num, base);
    return ten_to_other(temp, toBase);
  }
  public static String other_to_other2(String num,int base,int toBase){
    if("0".equals(num)){
      return "0";
    }
    if((base<2||base>36)||(toBase<2||toBase>36)){ //最大进制理论上是,26字母+10数字=36个。
      return "0";
    }
    if(base==toBase){
      return num;
    }
    int temp=Integer.parseInt(num,base);
    return Integer.toString(temp,toBase);
  }
  //十进制转换成二进制
  public static int toBinary(int num){
    return Integer.valueOf(other_to_other(num,10,2));
  }
  //十进制转换八进制
  public static int toOct(int num){
    return Integer.valueOf(other_to_other(num,10,8));
  }
  //十进制转换成十六进制
  public static int toOx(int num){
    return Integer.valueOf(other_to_other(num,10,16));
  }
  // 二进制转换成十进制
  public static int binaryToTen(int num){
    return Integer.valueOf(other_to_other(num,2,10));
  }
  // 八进制转换成十进制
  public static int OctToTen(int num){
    return Integer.valueOf(other_to_other(num,8,10));
  }
  // 十六进制转换成十进制
  public static int OxToTen(String num){
    return Integer.valueOf(other_to_other(num,16,10));
  }
  public static void main(String []args){
    System.out.println(other_to_other(1024, 10,16));
  }
}


谢谢!!

相关文章
Qt 布局管理之 停靠窗口QDockWidget
Qt 布局管理之 停靠窗口QDockWidget
725 0
|
Linux 应用服务中间件 虚拟化
Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问
Linux系列——VMware虚拟机配置端口转发(端口映射),实现远程访问
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
696 161
|
数据采集 传感器 监控
如何在LabVIEW中使用FPGA模块
如何在LabVIEW中使用FPGA模块
857 1
|
JavaScript 前端开发 安全
VITE+TS项目中别名需要分别设置避免冲突
VITE+TS项目中别名需要分别设置避免冲突
890 1
|
存储 人工智能 安全
AI时代,存力 or 算力 哪个更重要
本文探讨了AI技术发展中算力与存力的重要性。算力指计算能力,对处理大数据和实时计算至关重要;存力则是数据存储能力,确保数据安全可靠,支持后续分析。两者相辅相成,共同推动AI技术的快速发展,缺一不可。
|
存储 架构师 Java
内存溢出原因与解决方案(4大主流方案详解)
本文详解内存溢出(OOM)的原因及解决方案。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
内存溢出原因与解决方案(4大主流方案详解)
|
监控 Linux Python
百度搜索:蓝易云【Linux系统安装HomeAssistant教程。】
请注意,以上步骤提供了基本的Home Assistant安装指南。具体的安装过程可能因您使用的Linux发行版和软件源而有所不同。如果您遇到任何问题,请参考相应的文档,或寻求相关的支持和指导。
755 0
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。