目录

  • 一、整数十进制转二进制:
  • 1、调用API函数(简便方法)
  • 2、除基倒取余法
  • 3、位移操作实现
  • 二、小数十进制转二进制:
  • 三、进制间任意转换:
  • 1、java自带方法(简便方法)
  • 2、自定义方法
  • 任意进制转十进制
  • 十进制转任意进制




一、整数十进制转二进制:

1、调用API函数(简便方法)

思路:最简单的方法,直接用java封装好的函数计算。

public static String DecimalToBinary(int n){
 	 String result = Integer.toBinaryString(n);
 	 return result;
}

注: 此代码中,可以直接用字符串输出;也可以利用Interger.parseInt()转化为int,但不建议这种方式,当为负数时,int型的表示不了32的一个整数。

2、除基倒取余法

1.思路:每次得出一位二进制乘 (int)Math.pow(10, t),返回值为int

public static int DecimalToBinary(int n){
  	int t = 0;  //用来记录位数
  	int bin = 0; //用来记录最后的二进制数
  	int r = 0;  //用来存储余数
  	while(n != 0){
   		r = n % 2;
   		n = n / 2;
   		bin+=r*(int)Math.pow(10, t);
   		t++; 
  	}
  	return bin;
 }

2.思路:每次把得出的二进制拼接,返回值为String

public static String DecimalToBinary(int n){
  	String s = "";
  	while(n!=0) {
   		s = n%2+s;
   		n = n/2;
  	}
 	return s;
 }

3、位移操作实现

思路:将最高位的数移至最低位(移31位),除过最低位其余位置清零,使用& 操作,可以使用和1相与(&),由于1在内存中除过最低位是1,其余31位都是零,然后把这个数按十进制输出;再移次高位,做相同的操作,直到最后一位 。

public static String DecimalToBinary(int n){
  	String s="";
  	for(int i=31;i>=0;i--) {
   		int index = n >>> i & 1;
   		System.out.print(index);
   		s=String.valueOf(index)+s;
  	}
  	return s;
 }



二、小数十进制转二进制:

思路:小数转换与整数转化大同小异,需要先将整数与小数部分分开,各自转换,最后根据需求合并。

public static String DecimalToBinary(double n) throws Exception{
  	int in = (int) n;// 整数部分的值
  	double r = n - in;// 小数部分的值
  	String s = "";
  	while (in != 0) {
   		s = in%2+s;
   		in = in/2;
  	}
        s+=".";
        int count = 32; // 限制小数部分位数最多为32位,如果超过32为则抛出异常
        double num = 0;
        while (r > 0.0000000001) {
               count--;
               if (count == 0) {
                   throw new Exception("Cannot change the decimal number to binary!");
              }
               num = r * 2;
               if (num >= 1) {
                   s+="1";
                   r = num - 1;
               } else {
                   s+="0";
                   r = num;
               }
          }
        return s;
 }



三、进制间任意转换:

思路:先将输入进制转化为十进制,在将十进制转化为目标进制。

1、java自带方法(简便方法)

不得不感叹java的便捷,常用进制转换已经封装好,直接使用即可。

//10进制转换 16进制
 System.out.println(Integer.toHexString(val));
 System.out.println(String.format("%x", val));
 //10进制转换 8进制
 System.out.println(Integer.toOctalString(val));
 System.out.println(String.format("%o", val));
 //10进制转换 2进制
 System.out.println(Integer.toBinaryString(val));
 
 //16进制转换 10进制
 System.out.println(Integer.valueOf("f", 16));
 //8进制转换 10进制
 System.out.println(Integer.valueOf("11", 8));
 //2进制转换 10进制
 System.out.println(Integer.valueOf("0101", 2));

2、自定义方法

任意进制转十进制

public static int ToDecimal(int jinzhi, String str){
      int d;           // 保存取出的最低位
      int p = 0;      // 保存当前位权,从个位开始
      int sub = 0;    // 保存当前数值
      char c;
      int length = str.length();
      for(int i= 0; i<length;i++) {
         c = str.charAt(i);
         // 将字符转换为对应的数字
         if(c>='A'  && c<= 'Z') {
            d = c - 55;
         }else if(c>='a'  && c<= 'z') {
            d = c - 87;
         }else {
            d = c - 48;
       }
         // 当前位权
         p = length - 1-i;
         // 0^0 = 1
         if(d != 0) {
            sub += d*(int)Math.pow(jinzhi,p);
         }
      }
      return sub;
 }

十进制转任意进制

public static String DecimalTo(int num,int jinzhi){
  	 //table[]中的内容根据具体情况添加,此处仅做参考
         String[] table ={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
         ArrayList<String> list = new ArrayList<>();
         int tmp = 0;
         while(num!=0){
               tmp = num%jinzhi;
               num /= jinzhi;
               list.add(table[tmp]);
         }
         int len = list.size();
         String s="";
         for(int i = len-1;i>=0;i--){
              s+=list.get(i);
         }
         return s;
     }



参考资料:
JAVA 进制转换 十进制转任意进制