文章目录

  • Java 基础 —— 进制转换
    • 简介
    • 转换说明
      • 10进制转换Demo
    • 算法转换
    • R进制转进制
    • 扩展:统计输入整数二进制有多少个“1”
      • 需求
    • 扩展:进制转换(输入一个十六进制数值字符串,输出该值十进制字符串)
      • 需求
      • 小结

Java 基础 —— 进制转换

简介

在Java中,进制转换已经被封装在Integer中,无论是常规的10转2、8、16,还是相应的2、8、16进制转换10进制的方法(也包含10->n进制),n进制转10进制的常规方法。

转换说明

10进制转换其它进制对应的方法参数:
n —— 原10进制数据
r —— 进制
返回值
10转2Integer.toBinaryString(n);2进制字符串
10转8Integer.toOctalString(n);8进制字符串
10转16Integer.toHexString(n);16进制字符串
10转rInteger.toString(100, 16);r进制字符串

10进制转换Demo

  • Demo.java
public class Demo {
    public static void main(String[] args) {
        int n = 13;
        Integer.toHexString(n);
        System.out.println(n + "的二进制是:" + Integer.toBinaryString(n));
        System.out.println(n + "的八进制是:" + Integer.toOctalString(n));
        System.out.println(n + "的十六进制是:" + Integer.toHexString(n));
        System.out.println(n + "的三进制是:" + Integer.toString(n, 3));
    }
}
  • 控制台输出结果
13的二进制是:1101
13的八进制是:15
13的十六进制是:d
13的三进制是:111
  • 苹果计算器获取13的二进制

算法转换

/**
 * 一个char[]对象
 */
private static char[] array = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

/**
 * 转换进制函数
 * @param number 要转换的数值
 * @param n 转换的进制数
 * @return
 */
public static String myDec(int number, int n) {

    // String 是不可变的,每次改变都要新建一个String,很浪费时间。
    // StringBuilder是‘可变的String’ 。
    StringBuilder result = new StringBuilder();
    
    // 模拟计算进制的过程
    while (number > 0) {
        result.insert(0, array[number % n]);
        number /= n;
    }
    return result.toString();
}

R进制转进制

  • Demo.java
public class Demo {
    public static void main(String[] args) {
        // 1+4+16==21
        String s = "10101";
        // 结果是21
        System.out.println(Integer.parseInt(s, 2));
        // Integer 中封装好的函数:parseInt
        // 可针对二进制中的1的个数,在竞赛中很常用
        // JDK8中的实现方法使用的是 & 操作,所以比正常的遍历要快的多
        System.out.println(Integer.bitCount(21));
        // 上文21的二进制,所以21的二进制有3个'1'
    }
}
  • 控制台输出
21
3
  • 苹果计算器获取21的二进制

扩展:统计输入整数二进制有多少个“1”

需求

  • 题目
/**
 * @description: 输入整数,显示整数转换为二进制后,其中包含多少个1,例如:输入5 ,5的二进制为101,输出2
 * @mofified By:
 */
public static int findNumberOf1(int num) {
	/** 请完善此处代码 */
	return 0;
}
public static void main(String[] args) {
    // System.out.println("Test");
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext()) {
        int a = scan.nextInt();
        System.out.println(findNumberOf1(a));
    }
}

public static int findNumberOf1(int num) {
    int counter = 0;
    // 转为二进制字符串
    String aString = Integer.toBinaryString(num);
    for (int i = 0; i < aString.length(); i++) {
        if(aString.charAt(i) == '1') {
            counter++;
        }
    }
    return counter;
}

扩展:进制转换(输入一个十六进制数值字符串,输出该值十进制字符串)

需求

接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入)

  • 解法一
public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    while(sc.hasNextLine()){
        String s = sc.nextLine();
        // 不写进制的话,默认进制为10;
        int i = Integer.parseInt(s.substring(2),16);
        // substring(2)跳过前2个,Interger.parseInt(string s,进制 t);
        System.out.println(i);
    }
}

Integer.parseInt(string str,radix 16); // 不写进制的话,默认进制为10;

  • 解法二(解法一题意可能会变形,用解法二更为恰当)
public static void main(String[] args){
    Scanner sc= new Scanner(System.in);
    while(sc.hasNext()){
        String s = new String(sc.nextLine());
        // 16进制输入为字符串输入
        int num = 0;
        // i=2,用来跳过“0x”
        for(int i=2; i<s.length(); i++){
            if (s.charAt(i) >= 'A' && s.charAt(i) <= 'F') {
                num = num * 16 + s.charAt(i) - 'A' + 10;
            }else {
                num = num * 16 + +s.charAt(i) - '0';
            }
        }
        System.out.println(num);
    }
}

小结

Java中,字符串(某一进制数)转某一确定进制数。

// str:转换数值
// num:进制数
// 如果 x = Integer.parseinteger(1010);那么x=1010,因为radix无参时默认为10进制
Integer.parseInteger(String str, radix num);

更多推荐

Java 基础 —— 进制转换