65.9K
CodeProject 正在变化。 阅读更多。
Home

学习二进制和十六进制

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (139投票s)

2003年5月3日

Apache

20分钟阅读

viewsIcon

731285

downloadIcon

6018

初学者掌握计算机语言的指南。

前言

如果您已经从事编程工作几个月或几年,那么您很可能在职业生涯的某个时候遇到过二进制(简称bin)和十六进制(简称hex)这两个术语。对于那些在最近几年开始职业生涯的程序员来说,对这些神秘主题的透彻理解通常只为经验丰富的程序员所知。相比之下,一些年长、经验更丰富的程序员发现,在为计算机编程以完成工作时,这是一个基本概念。这种思维转变导致如今学习二进制和十六进制的程序员越来越少。

那么,您可能会问,在当今高级编程语言和库如此抽象的情况下,为什么还要费心去学习这些二进制和十六进制的胡言乱语呢? well,要真正理解计算机的特质(数据存储、内存、TCP/IP、调试、加密、位平面、压缩等)以及“如何”和“为什么”,就需要理解二进制和十六进制。事实是,几乎所有与计算机相关的内容都可以追溯到比特、字节、内存和CPU寄存器寻址。一旦您“揭开盖子”,看看任何现代技术,您都会发现最基本的东西就在眼前。因此,了解计算机所说的“行话”将在您遇到超出日常开发范围的问题时,让您领先一步。

引言

二进制和十六进制到底是什么?这个问题听起来很简单,但您真的知道吗?不幸的是,在编程界,有时会假设某些东西是已知的,而没有人愿意去问。当我刚开始学习时,有人必须告诉我,就像我现在告诉您一样。所以,如果您不确定,那么二进制和十六进制就是不同的计数系统。

是的,就是这样!但等等……什么是计数系统? well,它就是我们人类计算不同数量的方式。您有多少只耳朵?我猜是两只,对吗?您正在使用一个计数系统来表示那个数量。

所有使用过的计数和书写系统都包含我们称之为符号(glyph)的东西来表示值,无论我们是用罗马数字还是古代象形文字来计数。符号基本上是一种 fancy 的说法,指图片或字符,但目的是在书写中表示某物。即使在今天,我们也像古代一样使用符号来象征意义。不同的是,我们习惯看到的数字起源于阿拉伯,我们从小几乎就习惯看到它们,所以我们不必多想。

例如,为了表示十这个值,您一直以来都是这样做,最有可能使用阿拉伯数字“1”和一个紧随其后的“0”组合,看起来像这样:10,但在埃及象形文字中,您会使用一个拱形图案:。我们大多数人近年来不太习惯这样看待事物,但也许如果我们回到过去,这个10对普通大众来说也会显得同样奇怪。

快进到今天,您一生中一直使用的计数系统称为十进制。它带有前缀“dec”,字面意思是十。在十进制计数系统中,我们只有十个符号可以使用。因此,要表示十进制中的一个值,我们总共有十种选择:0、1、2、3、4、5、6、7、8 和 9。社会简单地约定每个符号代表一个数量,并且在九停止,因为零或无也是一个有效值。

然而,通过在工作系统中组合使用它们,我们可以创建任何想象得到的值。这就是我们最初拥有计数系统的原因,而且记住一个工作系统比记住数十亿个不同的符号来表示所需的所有数量要容易得多。

您知道吗?

您为什么一生都在用十进制计数?我的理论是,看看您有多少根手指。虽然历史没有告诉我们确切的故事,但我们确实知道人们在有了标签和术语之前就已经在计数了。由于这个原因,猜测我们有一个十进制的思维方式并不牵强。

基础知识

首先,我们需要回顾一下您在一年级学过的一个东西——如何数到十。您可能会说,“没问题,我一生都在做这件事,对吗?” well,这就是大多数人在学习二进制或十六进制时遇到的问题。您已经数了这么久,以至于您甚至不需要思考数字了;您只是知道数字。记住您小时候学过的东西,并且几乎要“忘记”您对数字的使用方式的理解,这很有帮助。接下来的内容将向您介绍一个久违的概念。

一打是多少?
当然是十二个!
是的,但十二是多少?
十二就是十二,您疯了吗?
也许吧,但十二是多少,就像一年级老师会问学生一样?
她会说十二!
不,如果她正在第一次教孩子数数,她会说,“十二是十个一和两个一。”

难道一个灯泡刚刚亮起来了吗?一切都回来了吗?好!记住您很久以前学过的计数基本原理至关重要。学习时请保持这种心态!

正如我之前提到的,在十进制(也称为基数10)中,我们只有十个符号或字符可以使用:0、1、2、3、4、5、6、7、8 和 9。它们中的每一个都代表一个不同的值。此外,值得一提的是,当使用符号进行数字运算时,通常称它们为数字。现在,如果我们从零开始数,到九为止,那么十个数字就足够了,但这肯定不是事实。

您还记得占位符的概念吗?它们充当容器以表示更大的值。小数点左边的数字中的每个占位符都比前一个占位符大十倍。对于数字 123(一百二十三),您应该注意到三个。所以,要表示大于九的值,我们将使用一个或多个占位符(将它们视为座位),这些占位符说,“如果那个数字坐在这个位置,那么它就比它本身的面值更有价值。”

以对话中的“一打”为例。十二大于九,所以如果我们想数到九以上,我们必须移到下一个占位符,并在那里放置数字1,表示大十倍。然后我们后面跟着一个零,这样每个人都知道它属于第二个占位符而不是第一个。现在我们有了十个值,数到十一点、十二点等等都很容易。

让我们来说明一下这个想法。另外,为了在此示例中清楚起见,我们将使用管道字符分隔占位符。

1 | 2 | 3

不要将 123 看作一个大块,而要将其视为一组百位,两组十位,以及三个个位。哇,如果您的学前班老师能看到您现在就好了!现在,让我们再次看看这个插图,但带有每个占位符的标签。

百位 十位 个位
1 2 3

请注意占位符的值;它们总是比前一个值大十倍。您猜怎么着,这个概念是地球上每个计数系统的基石。其他系统使用不同的占位符含义,但概念是相同的。在十进制中,每个占位符都比前一个占位符大十倍,这就是为什么它最初被称为基数10。然而,占位符的值可以像新袜子一样互换。

占位符始终存在,即使我们不使用它们。实际上,我们倾向于只关注用于构成数字的占位符。如果我们想显示可用的占位符,我们可以这样做,我们仍然会得到相同的数字。

十万位 万位 千位 百位 十位 个位
0 0 0 1 2 3


在这一点上,完全理解“0”背后的概念非常重要。请记住,零本身没有价值,仅用于表示“无价值”。您不能用它来表示数量——只能用占位符!请记住,数字在数字中的位置显示了该数字的真实值。数字本身只是一个我们可以识别和使用的符号。

如上所示,数字中的最后一个非零数字是占位符值不再被考虑在计算整个数字代表的含义中的地方。因此,可以理解任何前导零都不需要在给定数字中显示。可以安全地说 000123 等于 123。同样,由于前导零无关紧要,您也可以说 123 等于 00000000000000000000000000000123。假设这些零要容易得多。

您知道吗?

您是否意识到,您一生中一直在使用至少两种计数系统和更改占位符?事实上,它是一个使用复合占位符的非常复杂的结构,您每天都在使用它。在十进制中,占位符按十的倍数增长,但如果我们想在此基础上添加值为六十的占位符怎么办?想想我们报时时的小时和分钟。

看看这个 HH:MM 格式,我们有三个量合在一起。一个数字有两个占位符,在 MM 中是十的倍数,然后另一个数字有两个占位符,在 HH 中是十的倍数。然后最重要的是,您有两个占位符,其上限为六十,这会覆盖两个单独的占位符。这种结构比十六进制和二进制复杂得多,但我们每天都能轻松使用它。

以下午 1:59 为例。我们都知道,当下一分钟到来时,将是下午 2:00,而不是下午 1:60。要到达下午 2:00,我们添加到小时占位符并重置分钟占位符。六十是一个有效数字,但复合占位符必须覆盖它以保持我们正在使用的系统真实。由于小时和分钟占位符在六十之后封顶,我们需要添加到下一个占位符来继续,就像我们使用十进制计数到九一样。

十六进制

我们将从十六进制开始,因为它更容易添加到熟悉的系统中,而不是先减去。数学上讲,前缀 hex 意思是六,dec 意思是十。因此,十六进制这个词中的 hexadec 代表十六。它的意思是,实际上在 hex(十六进制的缩写)中,您有十六个数字可以使用,而不是像十进制那样只有十个。

另外六个数字从哪里来? well,决定使用字母来表示它们。我们可以使用世界上任何符号来表示新数字,但在实践中,我们同意从字母中借用。即使额外的符号来自字母,它们现在仍然充当数字,因为它们旨在表示我们都同意的某个数量。

所以现在我们总共有十六个数字可以使用,而不是十个:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。现在请记住,一个新的计数系统意味着我们有新的占位符值。事实上,我们可以使用的数字的数量直接对应于占位符的乘法值。数字数量和占位符值携手并进,因为它们都基于相同的数量,这也是为什么一个新系统在科学上被称为一个新基数的原因。十进制是基数10,十六进制是基数16,就是这个原因。

为了开始,让我们来数一下十六进制中从零到十。准备好了吗?这看起来大部分都很熟悉,只是最后有一个转折。

0 1 2 3 4 5 6 7 8 9 A

您说什么?为什么 A 在 9 之后? well,那个数字被选择用来表示比九大一的值。我们之所以没有使用两个占位符来表示数字十,是因为我们不需要。想想看,在十进制中,我们有十个数字。在十六进制中,我们有十六个。在十进制中发生的是,我们在九的时候用完了数字。我们没有什么可以表示更大的值了,所以我们被迫利用现有的占位符。但在十六进制中,我们还有更多数字可以使用。因此,我们不需要使用新的占位符。

您能猜到十二在十六进制中是多少吗?如果您说是 C,您就对了!如果您没有猜对,那么请花点时间停下来复习一下。数字只是表示某种数量。尽量不要纠结于它实际看起来像什么。它的外观只是一个我们都同意的图片。

现在,让我们数一下十六进制中的十五。

0 1 2 3 4 5 6 7 8 9 A B C D E F

正如您可能猜到的,F 等于十五。但是,如果我们想数到十六呢?那么,我们将面临和我们在十进制中数到九以上时一样的问题。我们将用完数字——F 就是十六进制的终点。为了解决没有更多数字的问题,我们在下一个占位符处放置一个 1。

在十进制中,每个占位符(座位)都比前一个座位大十倍。 well,在十六进制中,它是十六倍!开始看到相似之处了吗?再次使用管道字符分隔占位符,让我们用十六进制写出数字十六。

1 | 0

它可能看起来像十,但它不是,因为我们处于一个新系统,其基数是新的占位符值。所以,这应该被读作,“一组十六和零个一。”

一个计数系统中数字的数量与占位符的值之间总是有直接的对应关系。这就是基数。在十进制中,由于我们可以使用的十个数字,每个占位符都是乘以十。在十六进制中,由于我们有十六个数字可以使用,每个占位符都是乘以十六。这就是游戏的本质。占位符在数字用完时出现;因此,它们总是比数字中使用的前一个占位符大您计数系统中的数字数量倍。

为了巩固这一点,让我们来看一个十六进制和十进制数字,并带有标签的占位符。请注意,使用相同的数字,但它们的解释不同。

十进制 = 十位 个位
十六进制 = 十六 个位
数字 = 2 0

这里,我们有数字 20。但是,根据我们使用的是十进制还是十六进制,它可以代表两个不同的值。在十进制中,它等于 (2 x 10) + (0 x 1)。括号可以被认为是代表占位符。对于每个新的占位符,我们都有基数(十进制是十;十六进制是十六)乘以占位符的位置。

如果我想显示数字零,例如,在十进制中使用四个占位符,我可以这样说:(0 x 1,000) + (0 x 100) + (0 x 10) + (0 x 1)。或者,如果我足够大胆地在十六进制中使用四个占位符来显示数字零,它看起来会是这样:(0 x 4,096) + (0 x 256) + (0 x 16) + (0 x 1)。

现在,看看上面当翻译成十六进制的数字 20:(2 x 16) + (0 x 1)。看看现在的占位符。它们以十六的增量递增。如果您进行了计算,应该会注意到十六进制的 20 等于十进制的 32。即使字符看起来相同,当您更改占位符的值时,您也会改变整个数字的值。

这是我最喜欢的插图之一。让我们用一种不同的方式,并排计算十进制和十六进制中的数字三十三。

十进制 十六进制   十进制 十六进制   十进制 十六进制
1 1   12 C   23 17
2 2   13 D   24 18
3 3   14 E   25 19
4 4   15 F   26 1A
5 5   16 10   27 1B
6 6   17 11   28 1C
7 7   18 12   29 一维
8 8   19 13   30 1E
9 9   20 14   31 1F
10 A   21 15   32 20
11 B   22 16   33 21

我希望,到目前为止,您已经看到了一个模式。看看图表中的十进制数字 26。您能告诉我为什么十六进制等价物是 1A 吗?如果您能,请给自己一个赞。如果现在还不太清楚,别担心。休息一下,回来重读本文档的十六进制部分。只需考虑十六的组 (* 16) + (* 1) 作为占位符,并为每个座位使用更多数字。如果您仔细思考,它最终会变得有意义。

您知道吗?

要更好地理解十六进制或任何计数系统,您必须练习。一旦您真正掌握了十六进制,二进制就会迎刃而解。所以,这里有两个练习供您尝试开始。

  • 将以下数字转换为十六进制。45、8、52、23、71 和 100。
  • 为什么十进制数字 255 等于十六进制数字 FF?

二进制

前缀 bi 意思是二,所以您可能已经猜到了二进制也称为基数2,简称为bin。这意味着,我们只有两个数字可以使用:0 和 1。并且每个占位符都只比前一个占位符大两倍。这次我们没有字母要处理了!

这次让我们直接 dive in,首先并排用十进制和二进制计数,然后再进行解释。我将使用相同的概念,只是在一个不同的计数系统中。这样做的想法是先看到一些奇怪的东西,然后应用您新学的原理,让它立即变得熟悉,并加强系统的工作方式。

十进制 Bin   十进制 Bin   十进制 Bin
1 1   6 110   11 1011
2 10   7 111   12 1100
3 11   8 1000   13 1101
4 100   9 1001   14 1110
5 101   10 1010   15 1111

就像十进制中的9是魔术数字,十六进制中的F是魔术数字一样,二进制中的1是魔术数字。因为我们只有两个选择,所以我们必须像快用完一样使用占位符。所以,在我们数到一之后,我们就没有更多的数字可用了。我们必须求助于利用占位符。正如您所料,每个占位符都比前一个占位符大两倍。

让我们一次比较所有三种系统中的一个数字。在此示例中,我们将使用数字10。每个计数系统都会产生一个唯一的值。

十进制 = 十位 个位
十六进制 = 十六 个位
Bin = 个位
数字 = 1 0

在十进制中,大家都知道 10 等于十。在十六进制中,10 等于十六。现在,在二进制中,因为我们按二进制计数,10 等于二。这就像说,“一组二和零个一”,这是因为我们的占位符代表的值。在二进制中,因为您只有两个数字,每次计数增加两个数字时,您都必须使用占位符。由于数字太少,占位符的使用量急剧增加。

如果您回头看上面数到十五的二进制图表,请注意,每隔两步,下一个可用的占位符就会被填入 1。而且,不要忘记零的重要性!前导零被忽略,但尾随零不被忽略。除了保留占位符,您不能对 0 做任何事情。二进制中唯一有实际价值的数字是 1。一旦使用完毕,就需要一个新的占位符来帮忙。

再一次,这里有一个从零数到七的二进制图表,但这一次,它显示了几个占位符而不是假定它们,然后我们为了说明而将它们分开。

三十二 十六 个位
0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 0 1 1
0 0 0 1 0 0
0 0 0 1 0 1
0 0 0 1 1 0
0 0 0 1 1 1

花点时间思考我们讨论过的要点。现在,借助图表,您能告诉我二进制的 1100 在十进制中是多少吗?如果您说是十二,您就对了。如果您说是其他数字,请记住公式:(1 x 8) + (1 x 4) + (0 x 2) + (0 x 1)。

您知道吗?

现在我们已经回答了“是什么”,我们应该思考“为什么”我们使用二进制。归根结底,计算机只用数字进行通信。在数字时代,它归结为简单的数字。计算机用电路中的电状态来表示这些数字。电力本质上很简单,要么有电流,要么没有。就像是“是”和“否”或“开”和“关”。二进制非常适合表示这一点,因为每个数字都可以显示“开”或“关”的状态。0 表示没有电流,1 表示有电流。为了简化概念,计算机可以将三个数字表示为传输两次(二进制中的11)。

结论

恭喜您,无论您是否意识到,您刚刚学会了十六进制和二进制的基础知识。如果您退后一步,您可能会意识到所有字母、零和一的组合现在都有了一些意义。随着时间的推移,它们将不再看起来是随机的。

为了提高您的新技能,您必须练习——即使是处理更大的数字。我为了清晰和说明而将它们保持得很小,但在当今世界,在计算机工作中熟悉更大的数字至关重要。

如果您正在使用 Windows,请按住键盘上的 Windows 键打开计算器程序。只需输入 Win+R,输入 calc,然后按 Enter。将程序视图设置为“程序员”,您就可以处理和转换十进制、十六进制和二进制数字。

一旦您在十六进制和二进制方面成为一名熟练的专业人士,您还可以使用完全相同的占位符和数字概念来计算世界上任何您想要的系统,例如三进制(基数3)、八进制(基数8)或十二进制(基数12)。

历史

  • 2003-04-28 » 版本 1.0 发布。
  • 2003-06-10 » 版本 1.1 发布。
  • 2006-02-24 » 版本 1.2 发布。
  • 2013-03-23 » 版本 1.3 发布。
© . All rights reserved.