进制转换(二进制、八进制、十进制、十六进制)

本篇文章以 Java 代码做示范。

本文目錄

    • 進制介紹
    • 二进制转十进制
    • 八进制转十进制
    • 十六进制转十进制
    • 十进制转二进制
    • 十进制转八进制
    • 十进制转十六进制
    • 二进制转八进制
    • 二进制转十六进制
    • 八进制转二进制
    • 十六进制转二进制

進制介紹

对于整数,有四种表示方式:

  • 二进制:0,1,满 2 进 1。以 0b 或 0B 开头
  • 十进制:0-9,满 10 进 1
  • 八进制:0-7,满 8 进 1。以数字 0 开头
  • 十六进制:0-9及A(10)-F(15) 满 16 进 1。以 0x 或 0X 开头表示。此处的 A-F不区分大小写。
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 左侧可以直接看到其他进制的转换结果。

进制转换(二进制、八进制、十进制、十六进制)_第1张图片

八进制转十进制

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 8 的(位数 -1)次方,然后求和。
例子:请将 0234 转成十进制的数。

0234 = 4 * 80 + 3 * 81 + 2 * 82 = 4 + 24 + 128 = 156

进制转换(二进制、八进制、十进制、十六进制)_第2张图片

十六进制转十进制

规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数 -1)次方,然后求和。
例子:请将 0x23A 转成十进制的数。

0x23A = 10 * 160 + 3 * 161 + 2 * 162 = 10 + 48 + 512 = 570

进制转换(二进制、八进制、十进制、十六进制)_第3张图片

System.out.println(0x23A); // 570

既然学会了这三种进制转换为十进制的方法,那我们来练习:

  • 0b110001100 转为十进制
  • 02456 转为十进制
  • 0xA45 转为十进制

(尽量自己去计算,不要直接使用代码去得到结果。)

答案:

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

进制转换(二进制、八进制、十进制、十六进制)_第4张图片

十进制转八进制

规则:将该数不断除以8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。

例子:请将 131 转成八进制的数。

131 / 8 = 16 … 3

16 / 8 = 2 … 0

2 / 8 = 0 … 2

因此可以得到 131 转成八进制为 0203

进制转换(二进制、八进制、十进制、十六进制)_第5张图片

十进制转十六进制

规则:将该数不断除以16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
例子:请将 237 转成十六进制的数。

237 / 16 = 14 … 13(D)

14 / 16 = 0 … 14(E)

237 得到的十六进制为 0xED

进制转换(二进制、八进制、十进制、十六进制)_第6张图片
十进制的转换说完了,照样来做个练习题吧:

  • 123 转为 二进制
  • 678 转为 八进制
  • 8912 转为 十六进制

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

进制转换(二进制、八进制、十进制、十六进制)_第7张图片

二进制转十六进制

规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。

例子:请将 0b11010101 转成八进制的数。

每四位分一组:1101 0101

1101 0101 => 1101(D)0101(5) => 0xD5

练习:

  • 0b11100101 转为 八进制
  • 0b1110010110 转为 十六进制
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

进制转换(二进制、八进制、十进制、十六进制)_第8张图片

十六进制转二进制

规则:将十六进制数每 1 位,转成对应的一个 4 位的二进制数即可。

例子:请将 0x23B 转成二进制的数。

0x23B => 0x2(0010)3(0011)B(1011) => 0010 0011 1011

进制转换(二进制、八进制、十进制、十六进制)_第9张图片

练习:

  • 01230 转为 二进制
  • 0xAB29 转为 二进制
System.out.println(Integer.toBinaryString(01230)); // 0010 1001 1000
System.out.println(Integer.toBinaryString(0xAB29)); // 1010 1011 0010 1001

你可能感兴趣的:(java)