Post

进制 & 转换

简介

  • 进制(或称数制)是一种数学表示方法,用来描述数字在计算机和其他数字系统中的表示和处理方式。在计算机科学中,常见的进制有二进制、八进制和十六进制。
  • 不同的进制有不同的作用和优缺点。例如,二进制非常适合计算机内部的数字处理,因为它只有两个基本数字 0 和 1,可以通过硬件电路实现高效的加法和乘法运算。而十六进制则更容易阅读和书写,因为它包含了数字和字母,可以更方便地表示较大的数字,同时也更直观地表示二进制数据。
  • 在计算机编程中,不同进制的转换也经常使用到,例如将一个二进制数转换成十进制数,或者将一个十进制数转换成十六进制数等等。总之,进制在计算机科学中扮演着重要的角色,是理解和掌握计算机科学基础知识的重要组成部分。

分类

  1. 二进制(基数为 2):由 0 和 1 组成的数字系统。
  2. 八进制(基数为 8):由 0-7 组成的数字系统,使用前缀 0 表示。
  3. 十进制(基数为 10):由 0-9 组成的数字系统,我们平时所使用的数字系统就是十进制。
  4. 十六进制(基数为 16):由 0-9 和 A-F(或 a-f)组成的数字系统,使用前缀 0x 或 0X 表示。

计算机中主要用途

  1. 二进制(Base-2):在计算机内部,所有数据都是以二进制形式存储和处理的。二进制的主要用途是表示数字、字符和图像等二进制数据。例如,在计算机内部,使用二进制来表示整型、布尔型、位图和数据流等。
  2. 八进制(Base-8):八进制通常用于表示文件权限标志。在 Unix 系统中,文件的读、写和执行权限可以用三个八进制数来表示,例如 0664 表示文件权限为-rw-rw-r–。
  3. 十进制(Base-10):十进制是我们最为熟悉的数字系统,它通常用于表示时间、日期、货币和其他计量单位。在编程语言中,使用十进制来表示浮点型和高精度计算等。
  4. 十六进制(Base-16):十六进制通常用于表示颜色代码、内存地址、消息摘要等二进制数据。在计算机科学中,十六进制经常用于调试和测试,以便更好地查看和理解二进制数据。

之间转换

  1. 二进制到八进制/十六进制:

    • 八进制:将二进制数每三位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 8,第三组权值为 64,以此类推。然后将每组得到的权值加起来,即可表示成对应的八进制数。例如,二进制数 110100111 可以分为 011、010、011 和 1 三组,对应的八进制数就是 326。
    • 十六进制:将二进制数每四位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 16,第三组权值为 256,第四组权值为 4096,以此类推。然后将每组得到的权值加起来,即可表示成对应的十六进制数。例如,二进制数 110100111 可以分为 1101 和 0011 和 1 三组,对应的十六进制数就是 0xD3。
  2. 八进制到二进制/十六进制:

    • 二进制:将每个八进制数位上的数字分别转换成对应的三位二进制数即可。例如,八进制数 644 转换成二进制数就是 110 100 100。
    • 十六进制:将每个八进制数位上的数字分别转换成对应的四位二进制数,或者将每个八进制数位转换成三位二进制数并连接起来即可得到十六进制数。例如,八进制数 644 转换成十六进制数就是 0x1A4。
  3. 十进制到二进制/八进制/十六进制:

    • 二进制:使用除法取余法将十进制数依次除以 2,并将每次得到的余数倒序排列即可得到相应的二进制数。例如,十进制数 255 对应的二进制数就是 11111111。
    • 八进制:使用除法取余法将十进制数依次除以 8,并将每次得到的余数倒序排列即可得到相应的八进制数。例如,十进制数 255 对应的八进制数就是 377。
    • 十六进制:使用除法取余法将十进制数依次除以 16,并将每次得到的余数倒序排列。当余数大于等于 10 时,A-F(或 a-f)代表 10~15,例如 10 对应 A,15 对应 F。最终得到的数值即为相应的十六进制数。例如,十进制数 255 对应的十六进制数就是 0xFF。
  4. 十六进制到二进制/八进制/十进制:

    • 二进制:将十六进制数每一位转换为对应的四位二进制数即可。例如,十六进制数 0xAB 对应的二进制数就是 1010 1011。
    • 八进制:将十六进制数每两位转换为对应的三位八进制数并连接起来即可得到相应的八进制数。例如,十六进制数 0xAB 对应的八进制数就是 253。
    • 十进制:将十六进制数每一位分别转换成对应的十进制数,并根据位数从右向左依次相乘得到每个位上的值,最后将所有的值加起来即可得到相应的十进制数。例如,十六进制数 0xAB 对应的十进制数就是 171。

练习

  1. 将二进制数 10101010 转换成八进制和十六进制。

    • 八进制:将二进制数每三位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 8,以此类推。得到的每组数值即为对应的八进制数位。10101010 可以分为 1、010 和 101、010 三组,对应的八进制数为 152。
    • 十六进制:将二进制数每四位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 16,以此类推。得到的每组数值即为对应的十六进制数位。10101010 可以分为 1010 和 1010 两组,对应的十六进制数为 0xAA。

    所以,10101010 的八进制表示为 152,十六进制表示为 0xAA。

  2. 将八进制数 755 转换成二进制和十六进制。

    • 二进制:将每个八进制数位上的数字分别转换成对应的三位二进制数即可。7 变成 111,5 变成 101,5 变成 101。因此,八进制数 755 用二进制表示为 111101101。
    • 十六进制:将每个八进制数位上的数字分别转换成对应的四位二进制数,或者将每个八进制数位转换成三位二进制数并连接起来即可得到十六进制数。7 变成 0111,5 变成 0101,5 变成 0101。因此,八进制数 755 转换为十六进制为 0x375。

    所以,755 的二进制表示为 111101101,十六进制表示为 0x375。

  3. 将十进制数 128 转换成二进制、八进制和十六进制。

    • 二进制:使用除法取余法将十进制数依次除以 2,并将每次得到的余数倒序排列即可得到相应的二进制数。128 除以 2 得到 64 余 0,64 除以 2 得到 32 余 0,32 除以 2 得到 16 余 0,16 除以 2 得到 8 余 0,8 除以 2 得到 4 余 0,4 除以 2 得到 2 余 0,2 除以 2 得到 1 余 0,1 除以 2 得到 0 余 1。因此,128 用二进制表示为 10000000。
    • 八进制:使用除法取余法将十进制数依次除以 8,并将每次得到的余数倒序排列即可得到相应的八进制数。128 除以 8 得到 16 余 0,16 除以 8 得到 2 余 0,2 除以 8 得到 0 余 2。因此,128 用八进制表示为 200。
    • 十六进制:使用除法取余法将十进制数依次除以 16,并将每次得到的余数倒序排列。当余数大于等于 10 时,A-F 代表 10~15,例如 10 对应 A,15 对应 F。128 除以 16 得到 8 余 0,8 除以 16 得到 0 余 8。因此,128 用十六进制表示为 0x80。

    所以,128 的二进制表示为 10000000,八进制表示为 200,十六进制表示为 0x80。

  4. 将十六进制数 0x1A 转换成二进制、八进制和十进制。

    • 二进制:将十六进制数每一位转换为对应的四位二进制数即可。1 对应 0001,A 对应 1010。因此,0x1A 用二进制表示为 0001 1010。
    • 八进制:将十六进制数每一位转换为对应的三位二进制数,并将所有二进制数连接起来即可得到相应的八进制数。1 对应 001,A 对应 1010。因此,0x1A 用八进制表示为 032。
    • 十进制:将十六进制数每一位分别转换成对应的十进制数,并根据位数从右向左依次相乘得到每个位上的值,最后将所有的值加起来即可得到相应的十进制数。1×16^1+10×16^0=26。因此,0x1A 用十进制表示为 26。

    所以,0x1A 的二进制表示为 0001 1010,八进制表示为 032,十进制表示为 26。

  5. 将二进制数 1101010111011111 转换成八进制和十六进制。

    • 八进制:将二进制数每三位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 8,第三组权值为 64,以此类推。得到的每组数值即为对应的八进制数位。1101010111011111 可以分为 011、010、101、110、111 和 1 六组,对应的八进制数为 32567。
    • 十六进制:将二进制数每四位一组分组,从右向左依次为每组加权,第一组权值为 1,第二组权值为 16,第三组权值为 256,第四组权值为 4096,以此类推。得到的每组数值即为对应的十六进制数位。1101010111011111 可以分为 1101、0101、1101 和 1111 三组,对应的十六进制数为 0xD5DF。

    所以,1101010111011111 的八进制表示为 32567,十六进制表示为 0xD5DF。

  6. 将八进制数 654 转换成二进制和十六进制。

    • 二进制:将每个八进制数位上的数字分别转换成对应的三位二进制数即可。6 变成 110,5 变成 101,4 变成 100。因此,八进制数 654 用二进制表示为 110 101 100。
    • 十六进制:将每个八进制数位上的数字分别转换成对应的四位二进制数,或者将每个八进制数位转换成三位二进制数并连接起来即可得到十六进制数。6 变成 0110,5 变成 0101,4 变成 0100。因此,八进制数 654 转换为十六进制为 0x354。

    所以,654 的二进制表示为 110 101 100,十六进制表示为 0x354。

  7. 将十进制数 1024 转换成二进制、八进制和十六进制。

    • 二进制:使用除法取余法将十进制数依次除以 2,并将每次得到的余数倒序排列即可得到相应的二进制数。1024 除以 2 得到 512 余 0,512 除以 2 得到 256 余 0,256 除以 2 得到 128 余 0,128 除以 2 得到 64 余 0,64 除以 2 得到 32 余 0,32 除以 2 得到 16 余 0,16 除以 2 得到 8 余 0,8 除以 2 得到 4 余 0,4 除以 2 得到 2 余 0,2 除以 2 得到 1 余 0,1 除以 2 得到 0 余 1。因此,1024 用二进制表示为 10000000000。
    • 八进制:使用除法取余法将十进制数依次除以 8,并将每次得到的余数倒序排列即可得到相应的八进制数。1024 除以 8 得到 128 余 0,128 除以 8 得到 16 余 0,16 除以 8 得到 2 余 0,2 除以 8 得到 0 余 2。因此,1024 用八进制表示为 2000。
    • 十六进制:使用除法取余法将十进制数依次除以 16,并将每次得到的余数倒序排列。当余数大于等于 10 时,A-F 代表 10~15,例如 10 对应 A,15 对应 F。1024 除以 16 得到 64 余 0,64 除以 16 得到 4 余 0,4 除以 16 得到 0 余 4。因此,1024 用十六进制表示为 0x400。

    所以,1024 的二进制表示为 10000000000,八进制表示为 2000,十六进制表示为 0x400。

  8. 将十六进制数 0xFE 转换成二进制、八进制和十进制。

    • 二进制:将十六进制数每一位转换为对应的四位二进制数即可。F 对应 1111,E 对应 1110。因此,0xFE 用二进制表示为 1111 1110。
    • 八进制:将十六进制数每一位转换成对应的三位二进制数,或者将每个十六进制数位转换成四位二进制数并分为相邻的三位,然后每三位转换成一个八进制数即可。F 对应 111,E 对应 111。因此,0xFE 用八进制表示为 376。
    • 十进制:将十六进制数每一位分别转换成对应的十进制数,并根据位数从右向左依次相乘得到每个位上的值,最后将所有的值加起来即可得到相应的十进制数。F×16^1+E×16^0=15×16+14=254。因此,0xFE 用十进制表示为 254。

    所以,0xFE 的二进制表示为 1111 1110,八进制表示为 376,十进制表示为 254。

This post is licensed under CC BY 4.0 by the author.