计算机系统解密:从理解计算机到编写高效代码
上QQ阅读APP看书,第一时间看更新

1.8 处理二进制数的简单方法

众所周知,长时间对着显示器处理二进制数会有失明的危险,它会让人视觉疲劳!人们想出了一些让二进制数字更容易阅读的方法。下面将介绍其中的几种方法。

1.8.1 八进制表示法

其中一个节约用眼的方法是八进制表示法。八进制的意思是底数为8,而八进制表示法背后的思想是将3位当作一组。3位可以用来表示23,或者表示0~7的8个值。假设有一些巨大的二进制数,比如100101110001010100。这个数读起来很伤眼睛。图1-14展示了如何把二进制数转化为八进制表示。

图1-14 二进制数的八进制表示

如你所见,我们将位分组,每组3位,并将八进制值分配给每一组,得到456124,这样读起来就简便多了。要得到100的八进制值,只需简单地将其作为二进制数来处理:(1×22)+(0×21)+(0×20)= 4。

1.8.2 十六进制表示法

八进制表示法现在仍在使用,但没有过去那么广泛了。十六进制表示法(底数为16)已经基本取代了八进制表示法,因为现在的计算机都是以8位的倍数为单位,可以整除4,但不可以整除3。

将我们熟悉的十进制数字中的一些符号转换为二进制很容易,因为只需要其中的0和1。对于八进制,只需要10个数字中的8个。但是对于十六进制,需要16个,这比我们现有的10个数字要多。我们需要一些符号来代表10~15。我们假设符号a、b、c、d、e、f(或A、B、C、D、E、F)分别代表10~15。假设有一个可怕的二进制数,比如11010011111111000001,图1-15显示了如何将其转换为十六进制。

图1-15 二进制数的十六进制表示

在这个例子中,我们把4个位作为一组,然后将16个符号值(0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f)中的一个分配给每一组。例如,1101(第一个4位的组)在十六进制中将用d表示,因为它的值为十进制1×(23)+1×(22)+0×(21)+1×(20) = 13,而d代表数字13。将下一个4位的组映射到另一个符号,以此类推。最终11010011111111000001转换为十六进制中的d3fc1。表1-9展示了便捷的十六进制值列表,你可以参考这些值,直到它刻在你的脑海里。

表1-9 二进制数与十六进制数的转化

1.8.3 表示语境

怎么知道该如何解释一个数字?比如数字10,如果是二进制数,那么就是2;如果是八进制数,那么就是8;如果是十进制数,那么就是10;如果是十六进制数,那么就是16。数学书上使用下标进行区分,所以我们可以写为102、108、1010或1016,但是用电脑键盘输入下标很不方便。如果能有一个一致的记号就好了,但悲哀的是,很多人认为自己有更好的方法,因而会自己发明新的记号,于是我们曾使用过一堆记号。许多计算机编程语言都使用了以下记号法:

  • 以0开头的数字表示八进制数,例如017。
  • 以1~9开头的数字表示十进制数,例如123。
  • 以0x为前缀的数字表示十六进制数,例如0x12f。

请注意,我们无法区分八进制0和十进制0,但是这并不重要,因为八进制0和十进制0是相同的。很少有编程语言有二进制的记号,因为它确实不怎么使用了,而且往往可以从语境判断。有些语言,如C++,用0b前缀来表示二进制数。