文章目录
- 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转2 | Integer.toBinaryString(n); | 2进制字符串 |
10转8 | Integer.toOctalString(n); | 8进制字符串 |
10转16 | Integer.toHexString(n); | 16进制字符串 |
10转r | Integer.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);