对于任意数制R 的数n,都可以表达为
$$
n=\sum_{i=0}^{k} a_{i} R^{i}=a_{0} R^{0}+a_{1} R^{1}+a_{2} R^{2}+\ldots+a_{k} R^{k}
$$

一、十进制转R进制

方法:十进制数除R RR取余,余数倒着写
例:
66(D)→1000 010(B)计算过程:

①66/2=33,余数为0
②33/2=16,余数为1
③16/2=8,余数为0
④8/2=4,余数为0
⑤4/2=2,余数为0
⑥2/2=1,余数为0
⑦1/2=0,余数为1

66(D)→42(H)计算过程:
①66/16=4,余数为2
②4/16=0,余数为4

二、十六进制转二进制

方法:十六进制每一位写成四位的二进制数
例:42(H)→0100 0010(B)

三、八进制转二进制

方法:八进制每一位写成三位的二进制数
例:456(O)→100 101 110(B)

四、二进制转十进制

方法:二进制每一位加权求和
例:100 0010(B)→66(D)
计算过程:
$$
1 \times 2^{6}+0 \times 2^{5}+0 \times 2^{4}+0 \times 2^{3}+0 \times 2^{2}+1 \times 2^{1}+0 \times 2^{0}=66
$$

五、Java自带的进制处理

1
2
3
4
5
6
7
8
9
10
String s = Integer.toString(255, 16);//10进制数转0~35进制,结果为字符串
System.out.println("s="+s);

System.out.println(Integer.toString(666, 36));//666(D)转换为36进制

int a = Integer.parseInt(s, 16);//把字符串当做多少进制,结果转换为10进制
System.out.println("a="+a);

BigInteger m = new BigInteger(s,16);//把16进制的字符串封装为大数对象
System.out.println("big integer m="+m);

六、相关例题


题目一

题目介绍:

​ 小赵对进制特别感兴趣,不必研究2进制, 3进制, 4进制, 5进制… ,突然有一次,他发现了一个特殊的数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。之后他就去翻书,发现这种数叫sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。

输入:

输入含有些小10000000 整数,如果为0,则输入结束。输出若为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”每个结果占一行。注意:#n表示所读入的n值。

样例输入

1
2
3
4
1
2992
1234
0

样例输出

1
2
3
4
5
1 is a Sky Number.
2992 is a Sky Number.
1234 is not a Sky Number.
0 is a Sky Number.

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Scanner;

public class Main {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
if (getNum(n, 10) == getNum(n, 16) && getNum(n, 10) == getNum(n, 12)) {

System.out.println(n + " is a Sky Number.");
} else {
System.out.println(n + " is not a Sky Number.");
}

}
}

public static int getNum(int n, int R) {
int sum = 0;
while (n > 0) {
sum += n % R;
n /= R;
}
return sum;
}

}

题目二

描述

求出一个集合中的所有子集

思路

一个元素的所有子集个数之和为2的n次方,可以用二进制的角度来分析

1
2
3
4
5
6
7
8
例如 {1,2,3,4}
0 0 0 1 表示只打印第一个
0 0 1 0 表示只打印第二个

1表示打印,2表示不打印 转化为类似于01背包的问题

不妨让0~15的二进制数来表示所有集合的结果

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

public class Main {
public static void main(String[] args) {

char[] a = { 'A', 'B', 'C', 'D' };
for (int i = 0; i < Math.pow(2, a.length); i++) {
System.out.print("{");
int n = i;// i表示第几种结果
int index = 0;//// 当前是第几次去除以2(二进制数位指针左移一位)
while (n > 0) {
// n%2的结果看的是二进制最左边那个数,例如0001 中的1
if (n % 2 == 1) {
// 如果本位数显示是1则打印
if (n > 2) {
System.out.print(a[index] + " ");
} else {
System.out.print(a[index]);
}
}
// 指向二进制指针左移的次数,也是数组的指针或者索引(向右边移动)
index++;
n /= 2;
// 把最后一位剔除掉,相当于 0 0 0 1变成了 0 0 0
}
System.out.println("}");

}

}

}