好玩的数学书店 点击可立即购买↓↓↓ 《程序员的数学》,[日]结城浩著,管杰译,人民邮电出版社 以下是小学一年级时发生的事,我依然记忆犹新。 “下面请打开本子,写一下‘十二’。”老师说道。于是,我翻开崭新的本子,紧握住削尖了的铅笔,写下了这样大大的数字。 老师走到我跟前,看到我的本子,面带微笑亲切地说:“写得不对喔。应该写成 12 喔。” 当时我是听到老师说“十二”,才写下了 10 和 2。不过那样是不对的。众所周知,现在我们把“十二”写作 12。 而在罗马数字中,“十二”写作 XII。X 表示 10,I 表示 1。II 则表示两个并排的 1,即 2。也就是说,XII 是由 X 和 II 组成的。 如同“十二”可以写作 12 和 XII,数字有着各种各样的计数法。12 是阿拉伯数字的计数法,而 XII 是罗马数字的计数法。无论采用哪种计数法,所表达的“数字本身”并无二致。下面我们就来介绍几种计数法。
我们平时使用的是 10 进制计数法。
(注:这里的“种”指的是数字的种类,用来说明 10 进制和 2 进制中数字复杂程度的差异。如 2561 中包含四种数字,而 1010 中只包含两种数字。——译者注) 以上规则在小学数学中都学到过,日常生活中也一直在用,是众所周知的常识。在此权当复习,后面我们将通过实例来了解一下 10 进制计数法。
首先,我们以 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,即 102 (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 进制计数法。从 10 进制计数法类推,便可很快掌握它的规则。
用 2 进制计数法来数数,首先是 0,然后是 1,接下去……不是 2,而是在 1 上面进位变成 10,继而是 11,100,101…… 表 1-1 展示了 0 到 99 的数的 10 进制计数法和 2 进制计数法。
在此,我们以 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 进制计数法,我们来思考一下原因。计算机在表示数的时候,会使用以下两种状态。
虽说是开关,但实际上并不需要机械部件,你可以想象成是由电路形成的“电子开关”。总之,它能够形成两种状态。这两种状态,分别对应 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 进制更容易理解的原因之一。 不过,因为计算机的计算速度非常快,位数再多也没有关系。而且计算机不会像人类那样发生计算错误,不需要靠直觉把握数字的大小。对于计算机来说,处理的数字种类少、计算规则简单就最好不过了。 让我们来总结一下。
鉴于上述原因,计算机采用了 2 进制计数法。 人类使用 10 进制计数法,而计算机使用 2 进制计数法,因此计算机在执行人类发出的任务时,会进行 10 进制和 2 进制间的转换。计算机先将 10 进制转换为 2 进制,用 2 进制进行计算,再将所得的 2 进制计算结果转换为 10 进制。 ![]()
我们学习了 10 进制和 2 进制两种计数法,这些方法一般称作按位计数法。除了 10 进制和 2 进制以外,还有许多种类的按位计数法。在编程中,也常常使用 8 进制和 16 进制计数法。
8 进制计数法的特征如下:
16 进制计数法的特征如下:
一般来说,N 进制计数法的特征如下:
例如,N 进制计数法中,4位数 a3a2a1a0 为a3×N3+a2×N2+a1×N1+a0×N0(a3、a2、a1、a0是0~N-1中的数字。)
按位计数法在生活中最为常见,因此人们往往认为这种方法是理所当然的。实际上, 在我们身边也有不使用按位计数法的例子。 例如,罗马计数法。 罗马数字至今还常常出现在钟表表盘上。 ![]() 还有,在电影最后放映的演职员名单中,也会出现表示年号的 MCMXCVIII 等字母。这也是罗马数字。 罗马计数法的特征如下:
例如,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。罗马数字真是费劲啊! |
|