什么是十六进制系统?


13

什么是十六进制系统,为什么在计算中使用了那么多?我知道计算机使用0和1来存储数据,那么为什么要使用十六进制呢?


13
如果不是题外话,那么超级用户启动5年后,这种基本问题又不会重复吗?
Peter Mortensen 2014年

3
@PeterMortensen甚至很奇怪,至少在任何一个姐妹网站上甚至都没有问过它,至少不是我能找到的。
Nzall 2014年

9
也许不需要询问,因为Wikipedia有一个很好的答案:en.wikipedia.org/wiki/Hexadecimal
Piers Myers

4
为什么这么多投票?
六。

Answers:


31

十六进制是在计算中非常常见的数字系统。您可能之前听说过二进制二进制只有1和0。

人类大多使用十进制(以10 为底)系统,其中有10个数字:

0、1、2、3、4、5、6、7、8和9

但是,计算机不能使用十进制系统进行操作。它们具有二进制状态(真或假),因此以2为基数(二进制数字通常以0b开头),唯一的数字是0和1。

在早期,使用八进制(或以8为底)。很好是因为以8为底的二进制“ 10”是“ 0b1000”(十进制的10是二进制的1010)。八进制通常在写入数字时以“ 0o”为前缀(但在大多数编程语言中仅以“ 0”为前缀)。之所以称为以8为底,是因为我们有八个数字。

今天,八进制仍在使用,主要是在Unix和Linux中设置权限

随着时间的流逝,随着计算能力和空间的迅速增加,我们需要一种更简便的方法来表示更大的数字。它成为使用十六进制或以16为底的标准,因为16与8一样是8的幂,这使得数位转换变得容易(请参阅此注释。因为有16个数字,所以使用字母表示另外,十六进制通常以0x为前缀。

十六进制数也很有用,因为十六进制数是4位(1个八进制数可以表示2),因此一个字节中有两个数字。在大多数十六进制编辑器中,这是表示字节的方式。

数数

在基数10中,我们有10个数字。9之后,我们该怎么办?我们没有数字了。我们在原始数字的左边创建一个“十”位,将其设为1,最右边变为0。十六进制也发生相同的情况:

0、1、2、3、4、5、6、7、8、9,A,B,C,D,E,F,10、11等

直到我们达到0x1F,然后重复该过程直到0xFF(十进制255),然后得出0x100。有关计数的更多信息,请参见此处

以下图表显示了十进制,十六进制,八进制和二进制之间的转换: 十六进制转换表


21
主要好处是,由于16是2的幂,因此可以进行逐位转换。
TRiG 2014年

2
请注意,许多语言都使用0前缀而不是0o八进制数字。
ysap 2014年

2
您关于16的乘数是2的倍数的注释被错误地从TRiG的注释中复制。倍数无关。
Ryan Reich 2014年

2
@ justcool393,可能值得一提的是,您所说的“基数10”实际上是“十进制”。这可能有助于弄清以8为基数(八进制),以10为基数(十进制)和以16为基数(十六进制)之间的关系。
HalosGhost 2014年

3
啊 每个基地都是以10为基数!stale.soup.io/post/114652207/every-base-is-base-10
woliveirajr 2014年

4

什么是十六进制系统

十六进制是使用16位数字(0123456789ABCDEF)的以16为基的编号系统,与使用2(01)的二进制或使用10(0-9)的十进制相对。由于(在我们的系统中)只有10个数字,因此使用从A到F的字母来表示“数字#10”,“数字#11”等。

为什么在计算中使用了这么多

16是2的幂,可以轻松地将十六进制数转换为二进制数,并且如您所述,“计算机使用0和1来存储数据”。由于每个数字正好存储4位数据,因此十六进制数字可以很容易地转换为4个二进制数字(1位),反之亦然。

| hex bin  | hex bin  |
| 0   0000 | 8   1000 |
| 1   0001 | 9   1001 |
| 2   0010 | A   1010 |
| 3   0011 | B   1011 |
| 4   0100 | C   1100 |
| 5   0101 | D   1101 |
| 6   0110 | E   1110 |
| 7   0111 | F   1111 |

我们为什么要使用十六进制

它比二进制更容易表示大数。只有两个十六进制数字可以表示256个不同的值,如下所示:

dec  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ...

四个十六进制数字可以表示65536个值,依此类推。六角使得它更容易检查的东西称为数据hexdump都可以,如字母,数字和标点符号都存储在每个字符映射到0和256之间的数字(所谓的格式的ASCII,或有时使用其他的编码)。此外,还对许多其他文件格式(例如PNG)进行了调整,以使文件组成的每条信息都包含256位。

总而言之,16是2的幂,而256是16的幂。这使其成为表示二进制数和文本或其他数据的好方法。


2

什么是十六进制系统?

如果您有数字abcd,则此数字等于((a * + b)+ c) + d。所以这就像:

  • abcd(二进制)=((a * 2 + b)* 2 + c)* 2 + d
  • abcd(八进制)=((a * 8 + b)* 8 + c)* 8 + d
  • abcd(十进制)=((a * 10 + b)* 10 + c)* 10 + d
  • abcd(十六进制)=((a * 16 + b)* 16 + c)* 16 + d

在十六进制系统中,您需要16位数字,但是我们只有10位数字可用(0..9)。因此,对于缺少的6位数字,使用字符A..F,其中A = 10,...,F = 15。

当然,您还可以考虑其他许多数字系统,例如以5或7为底的数字系统。

使用数字进行计算并不重要,您使用的是哪个基数。您可以在二进制系统中进行加和乘,可以在十进制系统中进行,也可以在十六进制系统中进行。我们习惯于在十进制系统中进行计算,而计算机则在二进制系统中进行计算。

为什么在计算中经常使用十六进制系统?

如上所述,给哪个号码系统都没有关系。基本数字相同,只是表示形式有所变化。计算机将在内部始终以二进制形式存储和使用(例如计算)数字。

那么为什么程序员(像我一样)使用不同的数字系统?选择基于2的幂的数字系统有两个原因。第一是简短,其次是设置位的清晰视图。

矮度

如果我有一个将缓冲区内容写入控制台的函数,那么我可以编写以十进制打印的代码,十进制为1到3位数字(十进制:0..255)。如果我以二进制格式写数字,那么最终将输出1到8位数字(二进制​​:0..11111111)。我也可以使用八进制制,最后以1到3位数字(八进制:0..377)或十六进制为1到2位数字(十六进制:0..ff)。

这仅用于一个字节。现在假设您要编写一个32位数字:

  • 二进制:0..11111111111111111111111111111111
  • 八进制:0..37777777777
  • 十进制:4294967295
  • 十六进制:0..ffffffff

如您所见,十六进制输出是最短的。

看到位

存储打包信息的常见模式是单独使用字节中的每个位。让我们以文件属性为例(请参见MDSN)。您需要属性“隐藏”,“归档”,“只读”,“临时”等。您可以将每个属性存储在一个字节中,也可以将信息打包到一个字节(或多个字节)中,其中每个位恰好代表一个属性。如果查看MSDN文章中的dwFlagsAndAttributes,可以看到Windows正在使用此模式。

让我们以MSDN页面FILE_ATTRIBUTE_ENCRYPTED为例,该标志为十进制16384和十六进制0x4000。前导“ 0x”只是C程序员用来标记十六进制数字的约定,因此我们只看4000。当您想知道设置了哪些位时,则需要先将16384转换为二进制-不能做任何事情通常用心算。但是,让我们采用十六进制4000。这非常简单。16是2 * 4,因此每个十六进制数正好是4位。因此,我们仅将4转换为二进制0100,将零转换为二进制0000,就可以完成了。

通常,它与单个位无关,但程序员倾向于将其乘以2的幂。我们希望将程序加载到的地址不是16个最低有效位设置为零,而不是加载到随机地址。这样,如果您的地址为0x12345678,则可以轻松地看到该地址属于加载到0x1234的程序,而不是加载到0x03810000的程序。

首选二进制,八进制还是十六进制?

那是味道的问题。如果您直接想要查看二进制位,可能会很好。对于长整数,如果必须计数数字以查看是否设置了第23位或第24位,则二进制可能会令人沮丧。使用十六进制更容易,因为每个数字代表4位,因此您需要较少的计数。我个人很少使用八进制。这是非常罕见的。

但是为什么不使用基数32?

Base 32是2的幂。但是您将需要32位数字,例如0..9,A..V。这要记住的数字要多得多(您可以轻松找出“ S”将响应哪个数字吗?)。另一个警告是,使用基数32时,您松开了一个不错的功能,即两个十六进制数字恰好是一个字节,如果您查看内存内容,这将非常方便!同样,对于基数32,您仍然需要2位数字来表示一个字节可以具有的值。对于32位值,您只需要7位数字即可,而不是8位十六进制数字,但是对于以32位系统为基础的缺点而言,这并不是很多。


1

当今使用的不同数字表示系统为(=包括):
二进制,八进制,十进制和十六进制。
选择哪一个通常取决于手头任务的易用性。

二进制通常用于计算机系统和数字技术中,因为它很容易在电子产品中表示。基数为2的数字的函数易于构建,on / off,true / false或任何其他类似的重复二态信息表示也很容易构建。

如果存在由三个二进制数字组成的组,则最好使用八进制数,例如Unix / Linux中的权限设置中的情况。

暂时跳过十进制,十六进制与八进制一样好,但对于四个二进制数字,以及8位(一个字节)恰好适合两个十六进制的事实。(=答案
由此可见,计算机中的偶数8位组很容易被写下,表示和理解-即;在编写软件,处理数据(例如HTML / CSS中的rgb颜色值),形成数据结构以及其他类似内容时,在日常使用中非常方便。

十进制。人们可能会猜测十进制是由我们十个手指和脚趾的事实发展而来的。一位数字代表已计数的项目数,每个手指一个,最多10个。

这些代表以
2、8、10和16 为基数的数字系统。

通常,基数告诉您您可以计算多少个数字“项目”,例如,二进制有2个,十进制有10个。
由于十六进制有16个数字项,因此系统需要16个“数字”,因此使用0-9和af(与十进制相比多6个),其中在十进制系统中,“ a”等于10,而“ f”等于15。

继续一般模式:只要您有不错的个位数表示,任何以2基数 或更高的数字都可以正常工作。

十进制数字由以下形式形成:

... d *10³+ c *10²+ b *10¹+ a *10⁰

十进制数字“ dcba”-带有d,c,b,a,选自0123456789

现在将其更改为:

... d *base³+ c *base²+ b *base¹+ a *base⁰

并且您有一个更通用的形式来显示任何以2为底的“或更高”的“作品”;
例如,五位数,5的底数可能与上述任何其他数字一样方便,或者为什么不为时间(12小时=“ 10”的12底数)使用12位数(一打)的系统,而第一个“十进制”表示是一个小时的1/12 [5分钟])

注意:⁰¹²³-上标0123(如果屏幕上显示其他内容)


当前,这可能是它实际可能成为的“存根”。
汉奴
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.