【小记】二八十十六,进制团团转

这篇笔记咱主要写一下二进制、八进制、十进制、十六进制之间的互相转换。

Contents

前言

通过观察,我觉得二、八、十、十六进制数的互相转换可以总结为三大块:

  1. 十进制与其他进制互相转换
  2. 二进制与其他进制互相转换
  3. 十六进制与八进制的互相转换

话不多说,下面就按这三大块来归纳一下。

十进制与其他进制的互相转换

十进制到其他进制

整数部分

💡 方法除以基数倒取余

比如16进制,除以的基数就是16

  1. “除以基数”指的是将十进制数不断除以目标进制对应的基数,直到0为止。

  2. “倒取余”指的是将每次相除得到的余数倒序排列,即转换为了目标进制的数。


  • [例] 10进制转换为8进制

    decOct-2022-10-29

    图中的红色箭头展示了“倒取余”的过程

    图中将十进制1145转换为了八进制2171

  • [例] 10进制转换为16进制

    decHex-2022-10-29

    图中的红色箭头展示了“倒取余”的过程

    图中将十进制14191转换为了十六进制376F

小数部分

不是所有的小数都能转换为其他进制。比如现代计算机采用二进制计数,有很多小数都没法准确地转换为二进制(只能取近似值),这也是为什么说现在计算机无法完全准确地表示小数。

💡 方法乘以基数顺取整

比如2进制,对应的基数就是2

  1. “乘以基数”指的是不断将小数部分乘以目标进制对应的基数,直到小数部分0为止。

  2. “顺取整”指的是将每次相乘得到的数的整数部分顺序排列,即转换为了目标进制的数。


  • [例] 2进制转换为10进制

    decBinFractional-2022-10-30

    图中的红色箭头展示了“顺取整”的过程

    图中将十进制0.375转换为了二进制0.011

其他进制到十进制

💡 方法每一位数字乘上基数^对应指数(位权),然后相加求和

digitWeight-2022-10-30

本图中的数值12C.1415926,是十六进制数。

上图中,基数是16,“对应指数”就是橙色标出的数。以小数点为分界,小数点左侧第一位的对应指数为0,而小数点右侧第一位的对应指数为-1

从低位向高位(图中从右向左),这个指数不断增大。

十六进制的基数是16,那么八进制的基数就是8,以此类推。

  • [例] 16进制转换为10进制

    hexDec-2022-10-30

    图中将十六进制12C.14转换为了十进制300.078125

二进制与其他进制的互相转换

二进制和其他进制的互相转换就要方便多了。

二进制到其他进制

💡 方法以小数点为界,向左右两侧,每几位读为一个数,不足的就补零

  • 关于这里的“每几位”,需要看要转换为哪个进制的数。比如转换为十六进制,其一位能表示0-F16种状态,需要用4个二进制位来表示,那么就是每4位一读。

    再比如八进制一位能表示0-78种状态,需要用3个二进制位来表示,那么就是每3位一读。

  • 关于补零,无论是从小数点左侧第一位开始往左每几位一读,还是从小数点右侧第一位开始往右每几位一读,都难免遇到“位数不够读”的情况,这个时候就需要补零。


  • [例] 二进制转换为十六进制

    binHex-2022-10-30

    图中将二进制1001001.011转换为了十六进制49.6

    • 红色箭头展示了以小数点为分界,分别往左右进行读取。左侧从低位向高位,而右侧从高位向低位
    • 图中括号展示了补零的过程。100011都不足4位,按照读取方向,分别在其左方右方补零。
    • 最后,每4位一读,用十六进制表示出来,就得到了最后的结果。
  • [例] 二进制转换为八进制

    binOct-2022-10-30

    图中将二进制1001101.1011转换为了八进制115.54

    • 具体做法和上面一个例子一致,这里不多赘述。

其他进制到二进制

💡 方法:每位读为几位二进制数

  • 关于这里的“每位读为几位二进制数”,需要看转换前是哪个进制的数。比如原本是十六进制,其一位能表示0-1516种状态,需要用4个二进制位来表示,那么就是每位读为4位二进制数

  • 附一个对照表:

    八进制位 ←对应的二进制 十六进制位 ←对应的二进制
    0 000 0 0000
    1 001 1 0001
    2 010 2 0010
    3 011 3 0011
    4 100 4 0100
    5 101 5 0101
    6 110 6 0110
    7 111 7 0111
    8 1000
    9 1001
    A 1010
    B 1011
    C 1100
    D 1101
    E 1110
    F 1111

    实际应用中,可以根据8421码来进行计算,不用死记硬背。

    比如三位二进制101, 对应421,转换为十进制就是4+1=5
    再比如四位二进制1010, 对应8421,转换为十进制就是8+2=10


  • [例] 八进制转换为二进制

    octBin-fixed-2022-10-31

    图中将八进制67.23转换为了二进制110111.010011

    • 每一位八进制位读成3位二进制数(一位八进制位能表达8种状态,需要3位二进制位来表示)

    不想用8421码其实也没问题,八进制和十六进制的每一位数其实可以看作是十进制整数,使用除2倒取余的方法能将其逐位展开为二进制数
    (本质上还是按位读取,每位读为几位二进制数)

    decBinForEachDigit-2022-10-31

    比如上图中,原八进制数中的63分别可以用除2倒取余的方法展开为110011,和8421码得出的结果一致。

十六进制与八进制的互相转换

十六进制和八进制之间无法直接转换:

  • 如果要把十六进制数转换为八进制数,就需要先将十六进制转换为十进制或二进制,进而再转换为八进制。
  • 八进制转为十六进制也需要用十进制或二进制“过渡一下”

八进制转十六进制的例子

  • 通过二进制进行间接转换

    octHexViaBin-2022-11-02

    上图中我将八进制数12.450先转换为了二进制数001010.100101000,再转换为了十六进制数A.94

    二进制和其他进制互相转换的方法在上面已经介绍过了,这里就不多赘述。

  • 通过十进制进行间接转换

    octHexViaDec-2022-11-03

    上图中我将八进制数12.450先转换为了十进制数10.578125,再转换为了十六进制数A.94

    • 这里再提一嘴:十进制转为其他进制时,需将整数小数分而治之。

    十进制和其他进制互相转换的方法在上面也已经介绍过了,这里就不多赘述。

十六进制转八进制的例子

  • 通过二进制进行间接转换

    hexOctViaBin_fixed-2022-11-03

    上图中我将十六进制数C.98先转换为了二进制数1100.10011000, 再转换为了八进制数14.46

    可以看到,十六进制转八进制和八进制转十六进制的过程是十分类似的。

  • 通过十进制进行间接转换

    hexOctViaDec-2022-11-03

    上图中我将十六进制数C.98先转换为了十进制数12.59375, 再转换为了八进制数14.46

冷笑话

HalloweenMas-2022-11-04

这位老伙计为什么要在万圣节前夜穿上圣诞节的服装呢?

答:因为 Oct 31 = Dec 25

October(十月) 31 是万圣节前夜,December(十二月) 25 是圣诞节。
但是在这也可以理解成Octal(八进制) 31 = Decimal(十进制) 25 (*^_^*)