分享

为你揭开进制的秘密

 mjmyl 2017-12-03

内容节选自《程序员的数学》,已获图灵许可,由[好玩的数学]编辑整理,标题为小编所加,特此感谢。

好玩的数学书店 点击可立即购买↓↓↓ 小程序

《程序员的数学》,[日]结城浩著,管杰译,人民邮电出版社


小学一年级的回忆


以下是小学一年级时发生的事,我依然记忆犹新。


“下面请打开本子,写一下‘十二’。”老师说道。于是,我翻开崭新的本子,紧握住削尖了的铅笔,写下了这样大大的数字。



老师走到我跟前,看到我的本子,面带微笑亲切地说:“写得不对喔。应该写成 12 喔。”


当时我是听到老师说“十二”,才写下了 10 和 2。不过那样是不对的。众所周知,现在我们把“十二”写作 12。


而在罗马数字中,“十二”写作 XII。X 表示 10,I 表示 1。II 则表示两个并排的 1,即 2。也就是说,XII 是由 X 和 II 组成的。


如同“十二”可以写作 12 和 XII,数字有着各种各样的计数法。12 是阿拉伯数字的计数法,而 XII 是罗马数字的计数法。无论采用哪种计数法,所表达的“数字本身”并无二致。下面我们就来介绍几种计数法。


10进制计数法


什么是 10 进制计数法?


我们平时使用的是 10 进制计数法。


  • 使用的数字有 0、1、2、3、4、5、6、7、8、9 共 10 种。

  • 数位有一定的意义,从右往左分别表示个位、十位、百位、千位……


(注:这里的“种”指的是数字的种类,用来说明 10 进制和 2 进制中数字复杂程度的差异。如 2561 中包含四种数字,而 1010 中只包含两种数字。——译者注)


以上规则在小学数学中都学到过,日常生活中也一直在用,是众所周知的常识。在此权当复习,后面我们将通过实例来了解一下 10 进制计数法。


分解 2503


首先,我们以 2503 这个数为例。2503 表示的是由 2、5、0、3 这 4 个数字组成的一个称作 2503 的数。



这样并排的数字,因数位不同而意义相异。


2 表示“1000 的个数”。

5 表示“100 的个数”。

0 表示“10 的个数”。

3 表示“1 的个数”。


综上所述,2503 这个数是 2 个 1000、5 个 100、0 个 10 和 3 个 1 累加的结果。用数字和语言来冗长地说明有些无趣,下面就用图示来表现。



如图,将数字的字体大小加以区别,各个数位上的数字 2、5、0、3 的意义便显而易见了。1000 是 10×10×10,即 103(10的 3 次方),100 是 10×10,即 10(10 的 2 次方)。因此,也可以写成如下形式(请注意箭头所示部分)。



再则,10 是 101(10 的 1 次方),1 是 100(10 的 0 次方 ),所以还可以写成如下形式。



千位、百位、十位、个位,分别可称作 103 的位、102 的位、101 的位、100 的位。10 进制计数法的数位全都是 10n 的形式。这个 10 称作 10 进制计数法的基数或底。


基数 10 右上角的数字——指数,是 3、2、1、0 这样有规律地顺次排列的,这点请记住。



2进制计数法


下面讲解 2 进制计数法。


什么是 2 进制计数法?


计算机在处理数据时使用的是 2 进制计数法。从 10 进制计数法类推,便可很快掌握它的规则。


  • 使用的数字只有 0、1,共 2 种。

  • 从右往左分别表示 1 位、2 位、4 位、8 位……


用 2 进制计数法来数数,首先是 0,然后是 1,接下去……不是 2,而是在 1 上面进位变成 10,继而是 11,100,101……


表 1-1 展示了 0 到 99 的数的 10 进制计数法和 2 进制计数法。



分解 110


在此,我们以 2 进制表示的 1100(2 进制数的 1100)为例来探其究竟。



和 10 进制计数法一样,并排的数字,各个数位都有不同的意义。从左往右依次为:


1 表示“8 的个数”。

1 表示“4 的个数”。

0 表示“2 的个数”。

0 表示“1 的个数”。


也就是说,2 进制的 1100 是 1 个 8、1 个 4、0 个 2 和 0 个 1累加的结果。这里出现的 8、4、2、1,分别表示 23、22、21、20。即 2 进制计数法的 1100,表示如下意思。



如此计算就能将 2 进制计数法的 1100 转换为 10 进制计数法。




由此可以得出,2 进制的 1100 若用 10 进制计数法来表示,则为 12。


基数转换


接下来我们试着将 10 进制的 12 转换为 2 进制。这需要将 12 反复地除以 2(12 除以 2, 商为 6 ;6 再除以 2,商为 3 ;3 再除以 2……),并观察余数为“1”还是“0”。余数为 0 则表示“除完了”。随后再将每步所得的余数的列(1 和 0 的列)逆向排列,由此就得到 2 进制表示了。



同样地,我们试将 10 进制的 2503 转换为 2 进制计数法。



我们从图 1-2 可以知道 2503 用 2 进制表示为 100111000111。各个数位的权重如下:



在 10 进制中,基数为 10,各个数位是以 10n 的形式表现的。而 2 进制中,基数为 2, 各个数位是以 2n 的形式表现的。从 10 进制计数法转换为 2 进制计数法,称作 10 进制至 2 进制的基数转换。


计算机中为什么采用 2 进制计数法


计算机中一般采用 2 进制计数法,我们来思考一下原因。计算机在表示数的时候,会使用以下两种状态。


  • 开关切断状态

  • 开关连通状态


虽说是开关,但实际上并不需要机械部件,你可以想象成是由电路形成的“电子开关”。总之,它能够形成两种状态。这两种状态,分别对应 0 和 1 这两个数字。


  • 开关切断状态 … 0

  • 开关连通状态 … 1


1 个开关可以用 0 或 1 来表示,如果有许多开关,就可以表示为许多个 0 或 1。你可以想象这里排列着许多开关,各个开关分别表示 2 进制中的各个数位。这样一来,只要增加开关的个数,不管是多大的数字都能表示出来。


当然,做成能够表示 0 ~ 9 这 10 种状态的开关,进而让计算机采用 10 进制计数法,这在理论上也是可能的。但是,与 0 和 1 的开关相比,必定有更为复杂的结构。


另外,请比较一下图 1-3 和图 1-4 所示的加法表。2 进制的表比 10 进制的表简单得多吧。




若要做成 1 位加法的电路,采用 2 进制要比 10 进制更为简便。


不过,比起 10 进制,2 进制的位数会增加许多,这是它的缺点。例如,在 10 进制中2503 只有 4 位,而在 2 进制中要表达同样的数则需要 100111000111 共 12 位数字。这点从表 1-2 中也显而易见。


人们觉得 10 进制比 2 进制更容易处理,是因为 10 进制计数法的位数少,计算起来不容易发生错误。此外,比起 2 进制,采用 10 进制能够简单地通过直觉判断出数值的大小。人的两手加起来共有 10 个指头,这也是 10 进制更容易理解的原因之一。


不过,因为计算机的计算速度非常快,位数再多也没有关系。而且计算机不会像人类那样发生计算错误,不需要靠直觉把握数字的大小。对于计算机来说,处理的数字种类少、计算规则简单就最好不过了。


让我们来总结一下。


  • 在 10 进制计数法中,位数少,但是数字的种类多。

    →对人类来说,这种比较易用。

  • 在 2 进制计数法中,数字的种类少,但是位数多。

    →对计算机来说,这种比较易用。


鉴于上述原因,计算机采用了 2 进制计数法。


人类使用 10 进制计数法,而计算机使用 2 进制计数法,因此计算机在执行人类发出的任务时,会进行 10 进制和 2 进制间的转换。计算机先将 10 进制转换为 2 进制,用 2 进制进行计算,再将所得的 2 进制计算结果转换为 10 进制。



按位计数法


下面来介绍按位计数法。


什么是按位计数法


我们学习了 10 进制和 2 进制两种计数法,这些方法一般称作按位计数法。除了 10 进制和 2 进制以外,还有许多种类的按位计数法。在编程中,也常常使用 8 进制和 16 进制计数法。


  • 8 进制计数法

8 进制计数法的特征如下:


  • 使用的数字有 0、1、2、3、4、5、6、7 共 8 种。

  • 从右往左分别为 80 的位、81 的位、82 的位、83 的位……(基数是 8)


  • 16 进制计数法

16 进制计数法的特征如下:


  • 使用的数字有 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 共 16 种。

  • 从右往左分别为 160 的位、161 的位、162 的位、163 的位……(基数是 16)

  • 在 16 进制计数法中,使用 A、B、C、D、E、F(有时也使用小写字母 a、b、c、d、e、f)来表示 10 以上的数字。


  • N 进制计数法

一般来说,N 进制计数法的特征如下:


  • 使用的数字有 0,1,2,3,…,N-1,共 N 种。

  • 从右往左分别为 N0 的位、N1 的位、N2 的位、N3 的位……(基数是 N)


例如,N 进制计数法中,4位数 a3a2a1a0 为a3×N3+a2×N2+a1×N1+a0×N0(a3、a2、a1、a0是0~N-1中的数字。)


不使用按位计数法的罗马数字


按位计数法在生活中最为常见,因此人们往往认为这种方法是理所当然的。实际上, 在我们身边也有不使用按位计数法的例子。


例如,罗马计数法。


罗马数字至今还常常出现在钟表表盘上。



还有,在电影最后放映的演职员名单中,也会出现表示年号的 MCMXCVIII 等字母。这也是罗马数字。


罗马计数法的特征如下:


  • 数位没有意义,只表示数字本身

  • 没有 0

  • 使用 I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000) 来记数

  • 将并排的数字加起来,就是所表示的数。


例如,3 个并排的 I(III)表示 3,并排的 V 和 I(VI)表示 6,VIII 表示 8。


罗马数字的加法很简单,只要将罗马数字并排写就可以得到它们的和。比如,要计算1+2,只要将表示 1 的 I 和表示 2 的 II 并排写作III 就行了。但是,数字多了可就不太简单了。


例如,计算 3+3 并不是把 III 和 III 并排写作 IIIIII,而是将 5 单独拿出来写作 V,所以 6 就应该写作 VI。CXXIII(123) 和 LXXVIII(78) 的加法, 也不能仅仅并排写作CXXIIILXXVIII,而必须将 IIIII 转换为 V,VV 转换为 X,XXXXX 转换为 L,再将 LL 转换为 C,如此整理最后得到 CCI(201)。在“整理”罗马数字的过程中,必须进行与按位计数法的进位相仿的计算。


罗马计数法中还有“减法规则”。例如 IV,在 V 的左侧写 I,表示 5-1,即 4(在钟表表盘上,由于历史原因也有将 4 写作 IIII 的)。


让我们试着将罗马数字的 MCMXCVIII 用 10 进制来表示。


可以发现,MCMXCVIII 表示的就是 1998。罗马数字真是费劲啊!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多