任意进制的转换(二)

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

一. 进制转换


除了常见的十进制,二进制,八进制,十六进制(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));
  }
}


谢谢!!

相关文章
|
1月前
两个方法实现 任意两个进制间相互转换
两个方法实现 任意两个进制间相互转换
13 0
两个方法实现 任意两个进制间相互转换
进制之间的转换
说明:进制之间的转换有多种,我只列出自己常使用的方法。 十进制:十进制是以 0-9 这九个数字组成的,也是我们日常生活中最常见的数字 二进制:二进制是 0 和 1 这两个数字组成的,一般常用于计算机中表示 八进制:八进制是 0-7 这八个数字组成的,为了区分,一般开头以 0 开头 十六进制:十六进制由 0-9 和A-F 组成,从 A-F 为 10-15,为了区别,开头以 0x 开头
C#中字符串是否可以转换为数值
C#中字符串是否可以转换为数值
二、八、十、十六进制互相转换大全
二进制(0~1)、八进制(0~7)、十进制(0~9)、十六进制(0~9、10即A、11即B、12即C、13即D、14即E、15即F)
455 0
018.任意进制数的转换
018.任意进制数的转换
69 0
【c++】关于数值进制以及进制之间转化
【c++】关于数值进制以及进制之间转化
155 0
【c++】关于数值进制以及进制之间转化
c++数字和字符串的转换
c++数字和字符串的转换
201 0