2005-05-05:二进制数
俺自己写的短文虽然得到了 C# 的肯定,但实在是拿不出手来。毕竟那是根据几个网页的内容熬夜拼凑出来的。不过 C# 在我那篇短文的基础上做了一些增删,修补出一篇还算规整的文字,放在这里供大家参考吧。
在此篇短文中,我们没有讨论数的“正负号”问题,也没有讨论“小数点”。其中有关“正负号”的表达方法在我们开始真正制作计算机并且开始编写程序的时候加以讨论。“小数点” 的表达方法,就要放到更远的时候进行讨论了。
二进制数
现代电子计算机中使用的数字都是二进制数,其原因我们前面有所讨论 即二进制数只有 0 和 1 两个数字,便于用两种不同的“电平”来表达。或许你还听说过计算机中还常用十六进制数,其实十六进制数大可以看做是二进制数的一种简单记法而已,二进制才是基础。
学习二进制数之前,我们不妨先回顾一下司空见惯的十进制数,主要是重温几个概念。随手写出几个十进制数:0、9、283、9876,第一个重要的概念就是“位”,也就是一个数是由几个单独的数字组成,该数字就是“几位”数。
两个位数不同的数字,我们往往称其为“相差几个数量级”,在十进制数中,一个数量级指得是
我们现在要抛弃以前所学习的 “个位” 、“十位”、“百位” 这样的称谓,改称其为 “第
了解了“位”,剩下一个概念“数”就很简单了,它是指每个“位”上那个数。对于十进数,每个位上的数可取值的范围是
好了,二进制数的基本概念和十进制数是一样的,只不过“权”是
或许我们应该看下给定一个十进制数,该如何将其转换成二进数,实际上我们常用电脑上带的那个“计算器” 程序做这种转换。手工计算可以用所谓的 “短除法”,其核心是 “除以 2 取余数”。如果你想知道如何手工计算,那么我想请你首先注意一下这个简单的事实:一个十进制的偶数转成二进制数,“第 0 位”肯定是 0,而奇数转成二进制“第 0 位”肯定是 1。所以把一个十进制数转成二进制,你把它除以 2,那个余数就是二进制数的 “第 0 位”,那么“第 1 位”呢?继续把商除以 2,这时的余数就是“第 1 位”了。以此类推每个位上的数都是除以 2 取余数。
图(figure0056)给出了一个计算实例,十进制数 37 转成二进制数 100101。我们首先计算“37 除以 2”,余数 1 就是二进制数 100101 最右边的“第 0 位”。而商 18 继续除以 2,余数 0 是 100101 的“第 1 位”,商 9 继续除以 2,余数 1 是 100101 的“第 2 位”。这样一直算下去,直到商是 0 时结束。
以下我们用一些表格总结了一些最简单的二进制数——十进制数对应关系,没什么理解上的难度,关键是把它们背下来。
从表(3)可以看到,所谓十六进制数,无非是把一个二进制数中从“第 0 位”起向左每 4 位用一个单独的数字写出来。0 到 9 都是借用十进制数字,从十进制的 10 开始由于没有可供借用的单个数字了,所以就借用英文字母“A 到 F”。比如二进制数 01011010,以十六进制表达就是 5A。由此看来“
有时候二进制数还有一种特殊的用法,从表(3)我们已经知道“0000”到“1001”分别对应十进制数 0 到 9, 所以有时我们利用二进制数重新 “编码” 十进制数。 比如说十进制数 “35” ,它转成二进制数是 “100011” ,对应十六进制数“23”。但我们知道十进制的“3”对应二进制“0011”,十进制的“5”对应二进制的“0101”,所以我们可以把十进制的“35”写成“0011 0101”,这可不是把“35”转成二进制,而是借用二进制重新“表达”十进制数。这种编码我们称其为“BCD 码”,也就是“Binary Coded Decimal”,以二进制形式编码的十进制数。这个 BCD 码我们以后会用到,但实际上在现代计算机中它的用途不是非常广泛。