【计算机基础】关于进制

进制是什么 & 常见的进制

学计算机,那就肯定得懂一样东西——进制(哪怕你没有学过,多少也会懂点)

那进制是啥?

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制—X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

百度百科

进制这玩意,说白了就是我们数数的一个方式,像啥十进制(大家都知道的)就是满十进一

那进制有啥呢?常见的进制有:

  • 十进制最常见的,对人来说最常用的
  • 二进制计算机里面用的,计算机的底层进制就是二进制,这是因为计算机是由逻辑电路组成的,而逻辑电路通常只有两个状态:开关的接通与断开,这两种状态正好可以用二进制的1和0表示。二进制是非常常见的,天生就与计算机有着紧密的关系,它正好能代表高低电平,开关的接通与断开,也与逻辑学中的真,假相吻合(布尔类型的True和False)
  • 八进制常见于计算机,经常用于简化二进制的计算,但用得也确实比较少
  • 十六进制也是计算机中经常使用的,经常用来表示存储器的地址,用得稍微比八进制多一点。八进制和十六进制只是为了简化二进制的存在的。在计算器底层中,是只能使用二进制的,但是二进制只有0和1,动不动就进位,导致二进制数的位数通常都很多,难以记录,所以经常使用八进制和十六进制来简化。
  • 为什么是十六进制和八进制来帮忙?而不是我们更加熟悉的十进制?原因很简单,十六进制的基数是16,八进制的基数是8,二进制的基数是2,十进制的基数是10。它们之中,16是2的4次方,8是2的3次方(立方),但10与2并没有什么整数次方的关系。

上面这些呢,都是我们日常能见到的进制

各个进制的特点

十进制的特点:

  • 简写:DEC
  • 特点:满十进一
  • 计数 :0、1、2、3、4、5、6、7、8、9(10、11、12…19、20…)到九了,但我们是满十进一,个位变成0,向十位进一,那下一位就是10。个位满十,向十位进一;十位满十,向百位进一……
  • 单位数字:10个(0-9)

二进制的特点:

  • 简写:BIN
  • 特点:满二进一
  • 计数:0、1(10、11、100…)到一了,但我们是满二进一,个位变成0,向十位进一,那下一位就是10。个位满二,向十位进一;十位满二,向百位进一……
  • 单位数字:2个(0、1)

八进制的特点:

  • 简写:OCT
  • 特点:满八进一
  • 计数:0、1、2、3、4、5、6、7、(10、11、12…)到七了,但我们是满八进一,个位变成0,向十位进一,那下一位就是10。个位满八,向十位进一;十位满八,向百位进一……
  • 单位数字:8个(0-7)

十六进制的特点:

  • 简写:HEX
  • 特点:满十六进一
  • 计数:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F(10、11、12……1A、1B)到9了,之后的数字不能是像10、11一样的两位数,所以之后的数字以A-F代替10-15。
  • 单位数字:16个(0-F)

十进制与任意进制之间的互相转换

十进制转任意进制:

十进制转任意进制通常采用除基数,倒取余的办法,具体做法就是:把要转换的数除目标进制数的基数,直到整数变为0为止(下面以43转二进制为例)

43整除2,得21,余1

21整除2,得10,余1

10整除2,得5,余0

5整除2,得2,余1

2整除2,得1,余0

1整除2,得0,余1

把余数从下往上进行记录,得:101011

即43(10) =101011(2)

其它数,其它进制同理,只是十六进制要记得用A-F替换10-15

任意进制转十进制:

任意进制转十进制,一般用把二进制数按权展开、再相加的办法,举个例子(101011转十进制)

12^5 + 02^4 + 12^3 + 02^2 + 12^1 + 12^0

=32 + 0 + 8 + 0 + 2 + 1

=43

即:101011(2) = 43(10)

其它数,其它进制同理,只是十六进制要记得先把A-F替换成相应的10-15,再参与运算

十进制转任意进制(小数):

十进制小数转换成二进制小数采用 “乘2取整,顺序排列”法。下面以十进制转二进制(小数)为例:

具体做法是:先将整数部分与小数部分分开,整数部分直接转换成二进制数,小数部分的转换办法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。(原因是:有很多小数转换成二进制是无限小数,只能取舍,所以一般会设定一个精度,达到精度后就停止计算。)

例如(5.625转为二进制):

分成5、0.625

5转换成二进制是:101,先放一边

0.625*2 = 1.25,取整为1

0.25*2 = 0.5,取整为0

0.5*2 = 1,取整为1

顺着取整,得101

所以0.625(10) = 0.101(2)

所以5.625(10) = 101.625(2)

如果小数部分怎么乘都不为0的话,那就按之前规定的,算到精度要求为止。

例如:0.56转换为二进制(保留小数点后5位)

0.56*2 = 1.12,取整为1

0.12*2 = 0.24,取整为0

0.24*2 = 0.48,取整为0

0.48*2 = 0.96,取整为0

0.96*2 = 1.92,取整为1

……

所以,0.56(10) ≈ 0.10001(2)

任意进制转十进制(小数):

还是以二进制为例,二进制的小数转换为十进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等。比如:0.101转换为十进制:

12^-1 + 02^-2 + 1*2^-3

=½ + 0 + 1/8

=0.625

所以,0.101(2) = 0.625(10)

进制转换的算法实现(Python)

Python 200行代码实现任意进制与十进制之间的互相转化-Abyss-博客