《计算机科学导论》一2.2 位置化数字系统

简介: 本节书摘来华章计算机《计算机科学导论》一书中的第2章 ,第2.2节,[美]贝赫鲁兹A. 佛罗赞(Behrouz A. Forouzan)著 刘艺刘哲雨等译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节书摘来华章计算机《计算机科学导论》一书中的第2章 ,第2.2节,[美]贝赫鲁兹A. 佛罗赞(Behrouz A. Forouzan)著 刘艺刘哲雨等译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 位置化数字系统

在位置化数字系统中,数字中符号所占据的位置决定了其表示的值。在该系统中,数字这样表示:

image


它的值是:

image


其中,S是一套符号集;b是底(或基数),它等于S符号集中的符号总数,其中S1和Sk是代表分数部分或整个数字的符号。注意我们使用的表达式可以从右边或从左边扩展。也就是说,b的幂可以从一个方向由0到k-1,还可以从另一个方向由-1到-i。b的非负数幂与该数字的整数部分有关,而负数幂与该数字的小数部分有关。±符号表示该数字可正可负。本章我们将学习一些位置化数字系统。
2.2.1 十进制系统(以10为底)
本章首先讨论的位置化数字系统是十进制系统。decimal(十进制)来源于拉丁词根decem(十)。在该系统中,底b =10并且我们用10个符号来表示一个数。符号集是S ={0,1,2,3,4,5,6,7,8,9}。正如我们所知,该系统中的符号常被称为十进制数码或仅称为数码。本章中,我们使用±符号表示一个数可正可负,但记住这些符号并不存储在计算机中—计算机用以处理该符号的方式不同,如第3章中讨论的那样。
计算机存储正负数的方式不同。
在十进制系统中,数字写为:

image


但是为了简便,我们通常省略圆括号、底和正号(对于正数)。例如,我们把+(552.23)10写成552.23,底和加号是隐含的。
1.整数
在十进制系统中,整数(没有小数部分的整型数字)是我们所熟悉的,我们在日常生活中使用整数。实际上,我们使用它已经习以为常。我们把整数表示为±Sk-1…S2S1S0,其值计算为:

image

其中,Sk是1个数码,b=10是底,k是数码的数量。
另一种在数字系统中显示一个整数的方法是使用位置量,即用10的幂(100,101,…,10k-1)表示十进制数字。图2-1显示了在十进制系统中使用位置量表示一个整数。

image
图2-1 在十进制系统中使用位置量表示整数

例2.1 以下显示了在十进制系统中使用位置量表示整数+224。
image

注意,在位置1的数码2值为20,但是在位置2的同一个数码其值为200。还要注意通常我们省略掉的加号,实际上是隐含的。
例2.2 以下显示了在十进制系统中使用位置量表示整数-7508。我们已经使用1,10,100和1000来代替10的幂。
image

有时我们需要知道可以用数码k表示的十进制整数的最大值。答案是Nmax=10k-1。例如,如果k=5,那么这个最大值就是Nmax=105-1=99 999。
2.实数
在十进制系统中,实数(带有小数部分的数字)也是我们所熟悉的。例如,使用该系统来表示元和分($23.40)整数。我们可以把实数表示为±Sk-1…S1S0·S-1…S-l,其值计算为:

image


其中,S1是1个数码,b=10是底,k是整数部分数码的数量,l是小数部分数码的数量。十进制小数点是我们用于分割整数部分和小数部分的。
例2.3 以下显示了实数+24.13的位置量。

image

2.2.2 二进制系统(以2为底)

我们在本章中讨论的第二种位置化数字系统是二进制系统。binary(二进制)来源于拉丁词根bini(二)。在该系统中,底b=2并且我们用两个符号来表示一个数,即S={0,1}。该系统中的符号常被称为二进制数码或位(位数码)。如我们将要在第3章看到的,数据和程序是以二进制模式(即位串),存储于计算机中的。这是因为计算机由电子开关制成,它们仅有开和关两种状态。1位表示这两种状态之一,0位表示另一种状态。
1.整数
我们可以把整数表示为±(Sk-1…S1S0)2,其值计算为:

image

其中,Si是1个数码,b=2是底,k是数码的数量。
另一种表示二进制数的方法是使用位置量(20,21,…,2k-1)。图2-2显示了在二进制系统中使用位置量表示一个数。

image


例2.4 以下显示了与十进制数25等值的二进制数(11001)2。下标2表示底是2。

image


注意,相等的十进制数为N=16+8+0+0+1=25。
最大值
数码k表示的二进制整数的最大值是Nmax=2k-1。例如,如果k=5,那么这个最大值就是Nmax=25-1=31。
2.实数
在二进制系统中,一个实数(可带有小数部分的数字)可以由左边的k位和右边的l位组成,±(Sk-1…S1S0·S-1…S-l)2,其值计算为:
image

其中,Si是1个位,b=2是底,k是小数点左边位的数量,l是小数点右边位的数量。注意k从0开始,而l从-1开始。最高的幂是k-1且最低的幂是-l。
例2.5 以下显示了与十进制数5.75等值的二进制数(101.11)2。
image

注意,相等的十进制数为R=4+0+1+0.5+0.25=5.75。

2.2.3 十六进制系统(以16为底)

尽管二进制系统用于存储计算机数据,但是它并不便于在计算机外部表示数字,因为与十进制符号相比,二进制符号过长。然而,十进制不像二进制那样直接显示存储在计算机中的是什么。在二进制位数和十进制数字之间没有显然的关系。正如我们看到的那样,它们之间的转换也不快捷。
为了克服这个问题,发明了两种位置化系统:十六进制和八进制。我们先讨论更常用的十六进制系统。hexadecimal(十六进制)来源于希腊词根hex(六)和拉丁词根decem(十)。为了和十进制与二进制一致,它应该称作sexadecimal,根据拉丁词根sex和decem。在该系统中,底b=16并且用16个符号来表示一个数。字符集是S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}。注意符号A,B,C,D,E,F(大写或小写)分别等于10,11,12,13,14和15。该系统中的符号常被称为十六进制数码。
1.整数
我们可以把整数表示为±Sk-1…S1S0,其值计算为:

image

其中,Si是1个数码,b=16是底,k是数码的数量。
另一种表示十六进制数的方法是使用位置量(160,161,…,16k-1)。图2-3显示了
在十六进制系统中使用位置量表示一个数。

image


例2.6 以下显示了与十进制数686等值的十六进制数(2AE)16。

image

数码k表示的十六进制整数的最大值是Nmax=16k-1。例如,如果k=5,那么这个最大值就是Nmax=165-1=1 048 575。
2.实数
尽管一个实数可以用十六进制系统表示,但并不常见。

2.2.4 八进制系统(以8为底)

人们发明的与二进制系统等价并用于计算机外部的第二种系统是八进制系统。octal(八进制)来源于拉丁词根octo(八)。在该系统中,底b=8并且用8个符号来表示一个数。字符集是S={0,1,2,3,4,5,6,7}。该系统中的符号常被称为八进制数码。
1.整数
我们可以把整数表示为±Sk-1…S1S0,其值计算为:

image


其中,Si是1个数码,b=8是底,k是数码的数量。
另一种表示八进制数的方法是使用位置量(80,81,…,8k-1)。图2-4显示了在八进制系统中使用位置量表示一个数。

image


例2.7 以下显示了与十进制数686等值的八进制数(1256)8。
image

注意,相等的十进制数为N=512+128+40+6=686。
最大值
数码k表示的八进制整数的最大值是Nmax=8k-1。例如,如果k=5,那么这个最大值就是Nmax=85-1=32 767。
2.实数
尽管一个实数可以用八进制系统表示,但并不常见。

2.2.5 4种位置化数字系统的小结

表2-1是本章讨论的4种位置化数字系统的小结。

image

表2-2显示了数字15在十进制中使用2个数码,在二进制中使用4个数码,在八进制中使用2个数码,在十六进制中仅仅使用1个数码。十六进制表示法显然是最短的。

image

2.2.6 转换

我们需要知道如何将一个系统中的数字转换到另一个系统中的等价的数字。鉴于我们更熟悉十进制系统,先讲解如何从其他进制转换到十进制。接着讲解如何从十进制转换到其他进制。最后讲解如何简便地进行二进制与八进制或十六进制之间的互相转换。
1.其他进制到十进制的转换
这种转换是简单而迅速的。我们将数码乘以其在源系统中的位置量并求和便得到在十进制中的数。思路显示在图2-5中。
image

image

2.十进制到其他进制的转换
我们能够将十进制数转换到与其等值的其他进制。需要两个过程,一个用于整数部分,另一个用于小数部分。
(1)转换整数部分
整数部分的转换可使用连除。图2-6显示了该过程的UML图。我们在整本书中使用UML图。对于不熟悉UML图的读者可以阅读附录B。

image


我们称十进制数的整数部分为源,转换后的整数部分为目标。我们先创建一个空目标。接着反复除源并得到商和余数。余数插入目标的左边,商变为新的源。图2-7显示了在每次重复中如何得到商。
下面我们使用一些例子手工演示如图2-7所示的过程。
image

例2.11 下面演示如何将十进制数35转换为二进制数。我们从这个十进制数开始,一边连续寻找除以2得到的商和余数,一边左移。结果是35=(100011)2。
image

(2)转换小数部分
小数部分的转化可使用连乘法。我们称十进制数的小数部分为源,转换后的小数部分的数为目标。我们先创建一个空目标。接着反复乘源并得到结果。结果的整数部分插入目标的右边,而小数部分成为新的源。图2-8显示了该过程的UML图。图2-9显示了在每次重复中如何得到目标。我们使用一些例子手工演示如图2-9所示的过程。


image

例2.14 将十进制数0.625转换为二进制数。
image

解 因为0.625没有整数部分,该例子显示小数部分如何计算。这里是以2为底。在左边一角写上这个十进制数。连续乘2,并记录结果的整数和小数部分。小数部分移到右边,整数部分写在每次运算的下面。当小数部分为0,或达到足够的位数时结束。结果是0.625=(0.101)2。
image

(3)数码的数量
在把数字从十进制转换到其他进制之前,我们需要知道数码的数量。通过k=logbN的关系,我们总可以找到一个整数的数码的数量,其中x意味着最小的整数大于或等于x(这也称为x的高限),N是该整数的十进制值。例如,我们可以找到十进制数234在所有4个系统中的位数,如下所示:
a.十进制:kd=log10234=2.37=3,显而易见。
b.二进制:kb=log2234=7.8=8,因为234 = (11101010)2,所以正确。
c.八进制:ko=log8234=2.62]=3,因为234 = (352)8,所以正确。
d.十六进制:kh=log16234=1.96=2,因为234 = (EA)16,所以正确。
如果你的计算器不包括任意底的对数运算,参见附录G关于如何计算logbN的信息。
3.二进制-十六进制的转换
我们能轻松将数字从二进制转换到十六进制,反之亦然。这是因为在这两个底之间存在一种关系:二进制中的4位恰好是十六进制中的1位。图2-10显示了该转换是如何进行的。
image

例2.19 下面演示如何将二进制数(10011100010)2转换为十六进制数。
解 我们先将二进制数排为4位一组的形式:100 1110 0010。注意最左边一组可能是1到4位不等。我们根据表2-2所示的值对照每组等量转换得到十六进制数(4E2)16。
例2.20 与十六进制数(24C)16相等的二进制数是多少?
解 将每个十六进制数码转换成4位一组的二进制数:2→0010,4→0100,以及C→1100。该结果是(001001001100)2。
4.二进制-八进制的转换
我们能轻松将数字从二进制转换到八进制,反之亦然。这是因为在这两个底之间存在一种关系:二进制中的3位恰好是八进制中的1位。图2-11显示了该转换是如何进行的。
image

例2.21 下面演示如何将二进制数(101110010)2转换为八进制数。
解 每3位一组转换为1位八进制数码。根据表2-2所示的值对照每3位一组等量转换得到八进制数结果是(562)8。
例2.22 与(24)8相等的二进制数是多少?
解 将每个八进制数码写成对等的二进制位组,得到(010100)2。
5.八进制-十六进制的转换
将数字从八进制转换到十六进制并不难,反之亦然。我们可以使用二进制系统作为中介系统。图2-12显示了一个例子。
image

该步骤如下:
从八进制转到十六进制,我们先将八进制转到二进制。我们将位数重排成4位一组,找到十六进制的对等值。
从十六进制转到八进制,我们先将十六进制转到二进制。我们将位数重排成3位一组,找到八进制的对等值。
数码的数量
从一个底向另一个转换中,如果我们知道源系统数码的最大数量,就能知道我们在目标系统中所需用到的数码的最小数量。例如,如果在源系统中我们知道最多使用6个十进制数码,那么在目标系统中我们就知道要使用二进制数码的最少数量。通常,假设在以b1为底的系统中使用k个数码,在源系统中显示的最大数是b1k-1。我们可在目标系统中拥有的最大数是b2x-1。因此b2x-1≥b1k-1。这意味着b2x≥b1k,也就是:


image

例2.23 找出二进制数码的最小数,用于存储一个最大6个数码的十进制整数。
解 k=6,b1=10,b2=2,且x=「k×(log b1/ log b2)= 「6×(1/ 0.30 103)=20。最大的6数码十进制数是999 999,并且最大的20位二进制数是1 048 575。注意,可以用19位表示的最大的数是524 287,它比999 999小。因此我们肯定需要20位。

相关文章
|
7月前
|
算法 Android开发 Python
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
35 0
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
|
15天前
|
机器学习/深度学习 算法 BI
【设计】 【数学】1622 奇妙序列
【设计】 【数学】1622 奇妙序列
|
9月前
|
机器学习/深度学习 人工智能 异构计算
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?(2)
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?
198 0
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?(1)
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?
170 0
|
存储 安全 网络协议
|
算法
重温算法之只出现一次的数字
这是一道特别好的题目,虽然题目难度是简单,其实我们往往都会把简单问题复杂化,所以会导致问题越解越难,这就是要看看我们的大脑够不够灵光了。
95 0
重温算法之只出现一次的数字
|
JavaScript 安全 前端开发
【重温基础】6.数字
【重温基础】6.数字
90 0
|
机器学习/深度学习 人工智能 自然语言处理
重温五条 AI 基础规律
像机器学习如何人工“智能”
311 0
计算机中的数学【抽象代数】群的概念
image.png 抽象代数作为数学的一门学科,主要研究对象是代数结构,比如群、环、域、模、向量空间、格与域代数。“抽象代数”一词出现于20世纪初,作为与其他代数领域相区别之学科。
1819 0