本篇文章以 Java 代码做示范。
对于整数,有四种表示方式:
int n1 = 0b1010; // 二进制
int n2 = 1010; // 十进制
int n3 = 01010; // 八进制
int n4 = 0x10101; // 十六进制
System.out.println(n1+" "+n2+" "+n3+" "+n4); // 10 1010 520 65793
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 2 的(位数 -1)次方,然后求和。
例子:请将 0b1011
转成十进制的数。
0b1011
= 1 * 2(1-1) + 1 * 2(2-1) + 0 * 2(3-1) + 1 * 2(4-1) = 1 * 1 + 1 * 2 + 0 + 1 * 8 = 11
你可以打开windows自带小算盘,切换成程序设计人员模式,然后选择二进制输出 1011 左侧可以直接看到其他进制的转换结果。
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 8 的(位数 -1)次方,然后求和。
例子:请将 0234
转成十进制的数。
0234
= 4 * 80 + 3 * 81 + 2 * 82 = 4 + 24 + 128 = 156
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数 -1)次方,然后求和。
例子:请将 0x23A
转成十进制的数。
0x23A
= 10 * 160 + 3 * 161 + 2 * 162 = 10 + 48 + 512 = 570
System.out.println(0x23A); // 570
既然学会了这三种进制转换为十进制的方法,那我们来练习:
(尽量自己去计算,不要直接使用代码去得到结果。)
答案:
System.out.println(0b110001100); // 396
System.out.println(02456); // 1326
System.out.println(0xA45); // 2629
规则:将该数不断除以2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
例子:请将 34
转成二进制的数。
34 / 2 = 17 … 0
17 / 2 = 8 … 1
8 / 2 = 4 … 0
4 / 2 = 2 … 0
2 / 2 = 1 … 0
1 / 2 = 0 … 1
将得到的余数反过来得到 0b100010
。
而存储单位是 1 byte ( 8 bit ),因此需要往前补 0 => 0010 0010
规则:将该数不断除以8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
例子:请将 131
转成八进制的数。
131 / 8 = 16 … 3
16 / 8 = 2 … 0
2 / 8 = 0 … 2
因此可以得到 131 转成八进制为 0203
。
规则:将该数不断除以16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
例子:请将 237
转成十六进制的数。
237 / 16 = 14 … 13(D)
14 / 16 = 0 … 14(E)
237 得到的十六进制为 0xED
。
以 123
转二进制 为例,代码如下(以 1 byte 输出):
public class App {
public static void main(String[] args) {
int quotient = 0; //商
String output = " ";
int number = 123;
for(int n = 1; n <= 2; n++) {
for(int i = 1; i <= 4; i++) {
int remainder = number % 2; //余数
quotient = number / 2;
number = quotient;
output = remainder + output;
}
output = " " + output;
}
System.out.println(output); // 0111 1011
}
}
以 678
转八进制 为例,代码如下(以 1 byte 输出):
public class App {
public static void main(String[] args) {
int quotient = 0; //商
String output = " ";
int number = 678;
for(int n = 1; n <= 2; n++) {
for(int i = 1; i <= 4; i++) {
int remainder = number % 8; //余数
quotient = number / 8;
number = quotient;
output = remainder + output;
}
output = " " + output;
}
System.out.println(output); // 0000 1246
}
}
以 8912
转十六进制 为例,代码如下(以 1 byte 输出):
public class App {
public static void main(String[] args) {
int quotient = 0; //商
String output = " ";
int number = 8912;
for(int n = 1; n <= 2; n++) {
for(int i = 1; i <= 4; i++) {
String remainder = ""+number % 16; //余数
quotient = number / 16;
int temp = Integer.parseInt(remainder);
if(temp == 10) remainder = "A";
else if(temp == 11) remainder = "B";
else if(temp == 12) remainder = "C";
else if(temp == 13) remainder = "D";
else if(temp == 14) remainder = "E";
else if(temp == 15) remainder = "F";
number = quotient;
output = remainder + output;
}
output = " " + output;
}
System.out.println(output); // 0000 22D0
}
}
其实有 Integer.toHexString()、Integer.toOctalString()、Integer.toBinaryString()…等方法可以去用,这边就是想展现一下换算过程,参考就好。
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
例子:请将 0b11010101
转成八进制的数。
每三位分一组:11 010 101
11 010 101 => 11(3)010(2)101(5) => 325
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
例子:请将 0b11010101
转成八进制的数。
每四位分一组:1101 0101
1101 0101 => 1101(D)0101(5) => 0xD5
练习:
System.out.println(Integer.toOctalString(0b11100101)); // 345
System.out.println(Integer.toHexString(0b1110010110)); // 396
规则:将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
例子:请将 0237
转成二进制的数。
0237 => 02(010)3(011)7(111) => 010 011 111
为符合 1 byte 存储 010 011 111 => 1001 1111
规则:将十六进制数每 1 位,转成对应的一个 4 位的二进制数即可。
例子:请将 0x23B
转成二进制的数。
0x23B => 0x2(0010)3(0011)B(1011) => 0010 0011 1011
练习:
System.out.println(Integer.toBinaryString(01230)); // 0010 1001 1000
System.out.println(Integer.toBinaryString(0xAB29)); // 1010 1011 0010 1001