为什么要学习十六进制?[关闭]


28

那天我上了很多入门编程课,主要目的是让我对所发现的每种不同类型的编程有所了解。毫不奇怪,几乎每个类都以相同的格式运行:硬件简介,软件简介,然后进入实际编程。尽管了解硬件和软件的工作原理非常重要,但我始终对每门课程都涉及的一个主题感到困惑。

在我发现的软件介绍部分中,他们总是很着重于以二进制,十六进制甚至八进制数进行识字。我知道了解这些东西是什么,以及计算机如何解释它们是很好的,但是我从来没有发现自己真的需要知道如何读写这些数字系统。确实,我唯一见过的东西不是base 10,而是CSS中的颜色,如果您使用www.colorpicker.com之类的颜色,这会更加容易

我是否只是对编程世界中这些非基数10的数字系统的精彩用法一无所知,还是将这些部分纳入所有编程教科书中的古老传统?有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数?


1
有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数? 是的,如果您发现自己编写了与航空业相关的软件,则可能会遇到应答器代码,该代码是4位数的八进制数字。 en.wikipedia.org/wiki/Transponder_%28aviation%29
Ben Cottrell 2012年

Answers:


14

所有答案都是好的,但它们并没有解决我认为最有价值的部分。在不同的基础上学习“思考”可以使您更熟练地使用计算机处理数字的方式。

如果您想存储一串包装好的小写字母,您会怎么做?

好吧,这里有26个小写字母,可以轻松转换为0-31范围(即5位数字),您可以将6个5位数字打包到32位字段(int?)中,甚至还剩下足够的余量一些标点符号。

我并不是说十六进制对类似的东西有所帮助,而是了解数字如何转换。

另一种情况是,您经常使用base-64在ascii中传递较长的数字。您知道如何实施吗?为什么以这种方式实施?您甚至没有意识到这就是您每次在游戏的注册框中键入“ CD KEY”时要输入的内容吗?

另外,为娱乐起见,有时会玩一下12号底座。事实证明,数学在12级基础上确实很有趣(相比之下10级是愚蠢的,我希望我们能用6根手指进化,我们对数学的理解可能会领先几十年)。一些非常聪明的早期人类使用12进制来开发时钟。

在以10为底的数字中,我们有3个“酷”数字创建简单的模式,2、5和9,其中8、6和4作为“次要”酷数字。在基数12中,您将2,3,4,6,11作为“酷”数字,将8,9和10作为“次要”酷数字,这意味着如果使用基数12,我们将更好地识别数字模式因为我们会一直看到他们。

另外,二进制。你可以指望32点-我做了很多,有时数到5时就派上用场了:)

二进制很有趣,但是翻译得不好。当您对十六进制感到满意时,您会开始看到“ A”为1010,“ 5”为0101,这些事情开始变得很重要。如果您有一个要提取第6个位的位域:00100000,您将使用“位”对其进行“处理”?您应该只知道它是0x20。

如果看到的代码与0x0600对应,则提取了哪些位?您应该甚至不用考虑就知道-您实际上应该读起来就像是写为0000011000000000(但更容易阅读,因为您不必计算零)。

您为什么要限制您的大脑及其处理数据的能力?


实际上,时钟是在base60中开发的。
Denis de Bernardy 2011年

@Denis给我的印象是,当前的理论是它们是由一个以12为基数的人开发的,这些人输给了那些认为自己无法通过手指的笨拙的人。60只是将12个师进一步划分为5个小组,并且似乎是基地10个咕unt声的后援:)
Bill K

可能。老实说,我绝不是专家。您的评论仅带回了一些久已忘记的记忆。我还记得,以360度为单位的角度来自60级(和同一位巴比伦发明家),但是正如您所指出的那样,10级的咕gr声根本不及最初的12级数学家。:-)现在,想象一下是否像某些美洲印第安人一样以20为基数进行计数。:-D
Denis de Bernardy 2011年

44

学什么?要成为一名合格的程序员,您需要了解不同的数字基础,但是关于十六进制,几乎没有什么可学的,除了ABCDEF在9之后。


8
OP可能是指能够从其他基础上轻松地转换到基础10。从某种意义上说,这可能是一种有用的技能,但对于某些类型的低级程序员而言,可能仍然是有用的,但今天已经不重要了。例如,您可以在vim中进行转换。
Rein Henrichs

没错 我应该更清楚了。
jwegner 2011年

2
@Rein我从来都不擅长这样做(我必须脑子里做数学运算),所以我不能说。但是我以前在头脑上能够从十六进制转换为Z80汇编语言,这在当时是很有用的。我怀疑从十六进制转置为80x86汇编程序(或其他任何格式)的能力对于今天工作的程序员仍然有用。
尼尔·巴特沃思

1
@Neil Butterworth:确实,如果有内存,则8080操作码以八进制显示更有意义。我对它如何应用于Z80扩展记忆犹新。
David Thornley

1
@Neil:我认为重要的部分是寄存器到寄存器的移动指令,该指令以位格式显示为01xxxyyy,其中xxx是目标地址,而yyy源地址。我不知道是否还有其他八进制意义。
David Thornley

18

有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数?

八进制?通常不,不,除了* nix权限。

十六进制?你打赌 您忽略了我们当中大量的人,他们在嵌入式系统周围乱堆乱堆,只是在位级别上查看协议或文件格式等等。但是可以肯定的是,如果您离完成应用程序或网络工作的距离很远,则可能会更轻松地摆脱它。

示例:微控制器等上的配置寄存器。

取数字54312,随机打孔即可。你能告诉我设置了哪些位吗?我不能,至少不能离开我的头顶。则十六进制等效项为0xd428。另一方面,立即告诉我,我正在查看的位模式是1101 0100 00101000。对于这种事情,它的逻辑结构更为合理,当您靠近时,您会发现自己一直在需要该位模式金属。假设上面的数字是我从MCU复位时得到的,出于某种原因,我需要设置7位和9位。用十六进制,我可以很容易地看到结果数应该是0xd6a8,但是用十进制表示?那是54952,如果您问我,那简直就是直觉。当然,要在值上加上640即可,但要弄清楚这更麻烦。当然,在实践中,人们可能只是简单地将位移至正确的位置,或者将其与原始值进行或运算,但是您仍然可能想知道最终的表示形式。


1
哪种类型的提示问题为“为什么我应该关心设置了哪些位?” 对于某些(很多?大多数?)应用程序,这无关紧要。
尼尔·巴特沃思

10
同意-假设我们正在谈论高级开发。低电平,特定位是否被设置或清除不只是可能,但时而确定血腥微靴子可言,或者如果某个外围您需要获得权力,或者如果它运行在X的时钟速度,而大于y 。这仅仅是开始,而如果您要进行这种开发,则基本上一点点都很重要。有时很多。但是,这再次取决于您的域,我只是说;不要忘记嵌入式世界。=)
n42

1
+1-您越接近机器,使用不同底座的需求就越多。它不仅是嵌入式的,而且是嵌入式的。大多数语言都有位标记,出于明显的原因,它们通常以十六进制编写。相反,在第一门编程课程中讲课是毫无意义的,但随后大多数第一门编程课程都是毫无意义的。几乎所有的程序员都自学对吗?

1
@Davor:这是因为十六进制更易于阅读。我可以理解8位数的十六进制值比32位数的二进制值快得多。
史蒂夫·S

2
@Steve S:老实说,我怀疑这也是因为我们也很懒。.0x80比0b10000000短。但我同意。我也同意在第一门编程课程中它基本上没有意义,但是您可以将其推入离散数学,实时编程,计算机组织等领域。
n42

12

有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数?

如果要在Unix(或Linux)中设置文件权限,请使用3位数的八进制数字。第一位数字是用户的权限,第二位数字是组的权限,最后一位数字是其他人都获得的权限。

我必须在上周编写的代码中了解这一事实。

如果您查看标准哈希算法(例如MD5)的输出,则经常会发现它们以十六进制形式写出。我已经看到许多情况导致以不寻常的底数进行算术运算。

如果您想了解浮点数是如何在内部表示的,以及为什么为什么没有精确表示1/10,则绝对需要了解如何在不同的基数中进行算术运算。这是深奥的知识,直到它咬住您的后方,突然间您实际上需要急忙了解它。

这里面有一个的其他情况下,你会发现电脑里面的数据的基本的二进制性质此起彼伏。当然,如果您只是在编写CRUD网站,您可能永远不会遇到任何一个网站,因为它发生在别人已经处理过的级别上。


4
* nix权限不是真正的八进制。您不使用这些表示来执行数学计算。充其量它们是二进制掩码的八进制表示形式。
Joel Etherton

@Joel Etherton:当您从文件统计信息中获取权限时,它们以数字形式出现,默认情况下将以10为基数显示。如果您不理解转换为八进制或从八进制转换为数字,则很难理解这些数字。我正在编写需要解释这一事实的文档。有大量的数学计算。
btilly 2011年

@btilly:你误会了我的意思。如果您将文件权限设置为755,则无需将其添加到任何内容。它只是一个描述权限组合的掩码。当然,您必须认识到这意味着(4 + 2 + 1)(4 + 0 + 1)(4 + 0 + 1),但是这些仍然只是二进制掩码的表示。当您说“文件统计”时,您指的是什么?我从未见过以10为基数传递的权限的文件统计信息(严格遵循该示例)。
乔尔·埃瑟顿

1
@Joel Etherton:尝试一下perl -le '@stat = stat(shift); print $stat[2]' some_file,您将获得一个以10为底的统计数据。您需要以chmod相同的方式将其传递给Perl 。因此,将数字以这种方式存储在数据库中是有意义的,这时我需要记录这些数字与更熟悉的Unix权限之间的关系。如我所说,这不是一个假设的例子。
btilly 2011年

@Joel Etherton:假设您有一个权限为419(十进制)的文件,您想使该文件用户可执行,但不能被世界读取。您如何修改号码?C stat()调用中返回的值是一个int,选择打印方式是另一回事。
Vatine 2011年

9

希望在现实世界中,您不会对将十六进制从二进制转换为十进制有任何疑问。您将可以使用工具来转换所需的任何方式。

我同意您应该对发生的事情有所了解,但是为什么要记住什么时候可以查找呢?

但是,我发现记住键号(对我来说0x64 = 100、0xFF = 255、0xFFFF = 65535等)很有用,因为它们会出现很多。

我能弄清楚二进制,十六进制和八进制的8675309是什么吗?不,但是我可以打开一个需要时可以使用的工具。


3
您忘记了通常用作const的57005elvis = 57005;
Bevan

5

我唯一使用过八进制的是Unix系统上的文件权限。

如果您在接近有线协议或接近金属数据传输的情况下进行任何工作,则十六进制和二进制非常有用。从根本上讲,数据以二进制形式流动,一次仅以十六进制表示为半字节。

您还会发现数据表经常引用十六进制值,因此最好在代码中显示数据表中出现的值。

如果您使用它们中的任何一个,则最终您将非常熟练地转换为十进制或从十进制转换,至少对于常见值而言。

话虽如此;我怀疑重点主要是历史性的。如您所说,有很多程序员除了十进制外几乎不需要其他任何东西。


5

您实际上是在问为什么要学习2数表示的功效?

计算机由电路组成,电流以两种不同的水平(分别代表高和低)流过电路,我们使用二进制数字,因为它们可以保持两种状态,一种(高)或零(低)。

二进制数字形成模式。例如,如果您和我交谈的唯一方法是通过电路,我们可以确定如果您要给我发送字母A,您将给我发送二进制格式:1000001。由于我很懒,我不想记住7个七位数。相反,我将使用2的幂系统将大的二进制数字表示为较小的数字。我可以使用8(2 ^ 3)或16(2 ^ 4)。

如您所见,大多数计算机硬件和软件都使用二进制表示形式,而人类则使用八进制和十六进制等2种表示形式的幂来更有效,更轻松地读取二进制表示形式。

现在是需要了解2种表示形式的力量的普通程序员的示例

  1. ASCII码
  2. 统一码
  3. 了解内存管理编程(堆栈,堆,内存地址,核心转储)
  4. 调试
  5. 读取二进制数据主要在Hex编辑器中完成。

现在我的最后两分钱,我非常有信心,您可以很快学习2种表示形式的任何功能(因为您已经管理过入门编程课程)。成为一名普通的程序员。


3

我从未使用过八进制,但在调试器中看到十六进制并不罕见,有时在源代码中使用十六进制更为有意义(通常,因为基础数据是位标志)。


3

我不知道这些天是否有太多需求,但是很多年前,当我还是一名系统程序员时,能够阅读和理解十六进制是至关重要的。我将看到一个存储转储(全部用十六进制表示),然后将十六进制表示形式解码回IBM Assembly Language。在执行了一段时间后,您最终可以直接执行此操作-读取十六进制并编写等效的程序集。调试非常方便。添加和减去十六进制值对于计算基址寄存器的偏移量很有用。

我怀疑现在在实践中几乎不需要它,但是了解它几乎不是一件坏事。


那也是我获得十六进制技能的地方。后来,当我被迫在VAX / VMS上没有符号调试器的情况下调试代码时(我们将代码交付给客户而没有任何符号信息),我变得更加敏锐。如今,我很少使用它,尽管我们将某些信息以十六进制形式编码在某些URL中,并且偶尔进行一些解码是很有帮助的。
TomG 2011年

3

这并不是要“熟练”阅读二进制/十六进制,而是足够舒适,以便您在遇到它们时可以快速进行心理转换。想象一下编程,而不是对简单的算术感到满意,并且每次需要乘以2时,都必须使用计算器。

十六进制/二进制很重要,因为这是计算机使用的语言。您总是会在某些地方遇到它,尤其是在进行调试练习并且数据以十六进制表示时。

我还要强调必须在内部如何表示不同的数值类型以及算术如何工作的情况下理解以2为底的重要性。这样,您将更好地掌握何时以及如何处理浮点舍入问题和整数溢出。

再举一个例子,按位运算和位标志在编程中仍然很普遍,这是理解base-2重要的另一地方。


2

真的,我唯一一次看到除base 10以外的内容是针对CSS中的颜色,

您从未需要在Unicode代码表中查找字符吗?没看过其中的网址%20吗?从未使用过GUID?没见过IPv6地址吗?从未BLOB在SQL中编写文字?从未在十六进制编辑器中查看过文件吗?有一个很大的多数民众赞成在conventially六角谱写计算机相关的东西。

至于八进制,如今已很少见,但仍用于Unix文件系统权限。

另请参阅:按位运算的实际应用

即使您能够避免进行任何“接近线下”的编程,也要意识到计算机以二进制运行的事实仍然很重要,原因很简单:抽象泄漏

int大多数语言中的抽象泄漏了其固定宽度的性质。整数溢出,并且它们以“舍入”二进制数(例如2 31)进行溢出。只有小数点的思想家无法解释2038年的错误

float/ double如果你写抽象的泄漏2.基数0.1,你真的0.1000000000000000055511151231257827021181583404541015625。如果期望精确到0.1,那么您将得到错误。


2

在解决错误时,识别出其他模式下简单的特定数字通常是一个很大的线索。如果347的答案是错误的,那可能并不意味着什么,但是如果256或128的答案是错误的,那也许就意味着什么。如果将-1放入无符号的16位数据类型中,则会得到65535,比65536小1。如果您偶然知道2 ^ 16,则可以立即发现问题。

至于八进制,请看一下这些问题,看看是否偶然发现八进制会使得这些人成为更好的程序员。


1

了解这些系统及其工作方式后,可以使用一些高效的数学和数据压缩技术。您可能不会在前几项工作中使用太多。但是,当您成为高年级学生时,将它们放在您的后兜里是很不错的事情,并且要求您让运行在功率不足的过度工作的恐龙服务器上的过度工作的旧系统运行。
当您处理不带api的控制器和电子设备时,它变得尤为重要。特别是如果您正在编写该api。


1

在计算机科学研究的编程课程简介中,充分了解该材料非常有意义。当您使用汇编语言进行编程,设计硬件,参加形式语言课程时,您可以重新访问该主题。我大学的所有电气工程师都需要一门编程入门课程,他们很可能会继续使用该信息。除此之外,还不是很重要。


1

在处理字符集时,八进制数字有时会很有用。后者是基于字节的,一个八进制= 8位=一个字节。例如,在UTF-8中,非ASCII字符可以具有两个或更多字节;八进制数比十六进制数更方便表示它们。

有点有用,因为...嘿!您知道计算机一直在处理0和1,对吗?我的意思是认真的……唯一的笑就是计算机科学家是唯一知道1 +1 = 10的人。这对于与位相关的运算符或作为varbits也很有用。当处理一系列标志时,后者可以减少数据库中的存储需求。

至于十六进制,我认为您从未打开过十六进制编辑器来增强RPG角色的统计数据和设备。如果不这样做,而不是下载字符编辑器,您就会完全了解为什么可以方便地理解十六进制数字了。;-)


我认为您的意思是“八位字节”,而不是“八进制”。八进制数字是三位。对于非ASCII字符,使用八进制常量是C早期的一个保留,C是在PDP-11上开发的,PDP-11在大多数文档中都使用八进制表示形式(请参阅此PDP-11参考卡)。
TMN

我可能是。英语不是我的母语。:-)
Denis de Bernardy 2011年

1

我3年前从大学毕业,我认为能够读写十六进制数字非常重要。我搞砸了许多工作的大型XML文件(大意味着100MB +)。有时您会收到抱怨无效XML字符的XML文件,该XML文件无法在任何文本编辑器中显示,因此我不得不使用十六进制编辑器并编写代码来查明无效字符。如果不知道十六进制数,该任务将非常艰巨。


1

许多年前,当我在8位系统上工作时,就了解了十六进制的价值。

清楚地知道某物位于B000或E7FF上,这是惊人的。

昨天我需要确切地知道一行文字的末尾是什么字符。知道0x0A和0x0A 0x0D之间的差异非常重要。


1

有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数?

这些天八进制很少见,但我经常使用十六进制,并且经常考虑二进制中的问题。

我主要使用C和C ++以及一些Objective C进行编程,并在Linux和Mac OS X上处理光栅和矢量图形。在这些领域中,编写高效运行并充分利用存储空间的代码至关重要。您还必须了解机器内部表示您正在使用的内容的方式。最方便的查看方式是十六进制。例如,一个标准的24位彩色像素用三个字节表示,并且一眼就知道0x000000是黑色,0x00FF00是红色,0x008000是粉红色确实非常有用!

我也与文件格式的国际标准一起工作。我最近使用的是MXF,它用于存储广播,DVD等视频。它是一种二进制格式,同样,使用十六进制或有时是二进制最容易处理。当您调试为什么某些基于MXF的视频无法在您的系统上正确播放时,能够方便地浏览一些32位字段并意识到无意设置了空白屏幕的位置,这很方便-您可以执行此操作以十六进制表示,但以10为基数几乎是不可能的。

如果您打算花费大量时间编写Perl来按摩文本字符串,那么就不用了,您可能不需要非常熟悉十六进制,八进制或二进制。但是当您开始处理我要做的事情时,十六进制和二进制至少是必不可少的。


0

如果您想成为一名程序员,则应该知道十六进制。您不得不承认在罕见的日子里工作,这太尴尬了,您需要知道它不理解。

并不意味着您必须在头部加上十六进制数字。如果您仍然这样做,它将开始使您迷惑定期添加的规则。:)


0

二进制,十六进制和八进制的共同点不是它们不是base10,而是它们都是2的幂。由于计算机本质上是二进制的,因此这为它们中的每一个提供了一些应用程序,它们是显示和处理数据的最合适或最有效的方式。

当所有编程都处于低水平时,这曾经非常重要。在当今的高级编程中,2幂次幂系统的重要性要低得多。在每门编程课程中对它们进行全面介绍可能是过去的遗迹。

但是,即使您使用高级语言,这些数字系统仍然有其用途。例如,颜色仍以24位存储,每种原色8位存储。而且由于十六进制是一种以人类可读的方式表示字节的最佳方法,因此它甚至是CSS的一部分,对于从未接触过编程的人来说应该可以使用。

如果不了解二进制文件,就无法理解计算机。二进制简介是编程的每个详尽介绍中必不可少的部分。在日常工作中,您可能不需要在数字系统之间进行大量转换,但是进行这样的练习是真正熟悉这些数字系统的唯一方法*。要正确理解,唯一的方法就是知道一个以上的非base10数字系统,该数据可以用多种方式表示,所有这些方式都是有效的。

  • 正如约翰·冯·诺依曼(John von Neumann)所说:“ [..]我们不了解事物,我们习惯了它们。”

0

我认为从一个基础到另一个基础的转换对于编程来说不是很重要。在高级编程中,您不需要转换(并且可能会使用lib函数和计算器。)当您进入低级编程时,您就不再在入门课程中了。

我认为在基础课程中必须涵盖两个(相关)问题。

  1. 关于编码。它与数学转换无关,而是与使用数字(任何类型的数字)存储信息(任何类型的信息)有关。如果需要,您可以用莫尔斯电码或数字来说明。但是由于计算机宁愿使用二进制文件,而二进制文件通常显示为十六进制,因此通常用十六进制示例说明情况。(而且,当他们在讨论时,他们可能会解释一些有关本主题中提到的行尾的内容。我只建议您认识一下它可能采用的各种形状和形式,其中一些是0x0D,0x0A ,CRLF,'\ n'和'\ r')

  2. 溢出问题。再一次,没有必要用十六进制来说明。您可以使用y2k示例(与十六进制无关),在这里我也只建议您识别各种最有可能的指标(255、32767、65535、2M14),为什么它们是指标直接与字节性相关联内部存储,但转换不是重要的部分。

我不同意您需要了解位标志(因为在编程的入门课程中,命名常量更具指导性和实用性。)


0

如果您要进行低级嵌入式编程,则将使用十六进制。它用于指定硬件寄存器中的位模式以及内存转储中的字节值之类的事情。您还将学习以使用的任何编程语言使用每个按位运算符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.