什么是十六进制系统,为什么在计算中使用了那么多?我知道计算机使用0和1来存储数据,那么为什么要使用十六进制呢?
什么是十六进制系统,为什么在计算中使用了那么多?我知道计算机使用0和1来存储数据,那么为什么要使用十六进制呢?
Answers:
十六进制是在计算中非常常见的数字系统。您可能之前听说过二进制,二进制只有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。有关计数的更多信息,请参见此处。
以下图表显示了十进制,十六进制,八进制和二进制之间的转换:
0
前缀而不是0o
八进制数字。
什么是十六进制系统
十六进制是使用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的幂。这使其成为表示二进制数和文本或其他数据的好方法。
如果您有数字abcd,则此数字等于((a * + b)+ c) + 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位数字:
如您所见,十六进制输出是最短的。
存储打包信息的常见模式是单独使用字节中的每个位。让我们以文件属性为例(请参见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位,因此您需要较少的计数。我个人很少使用八进制。这是非常罕见的。
Base 32是2的幂。但是您将需要32位数字,例如0..9,A..V。这要记住的数字要多得多(您可以轻松找出“ S”将响应哪个数字吗?)。另一个警告是,使用基数32时,您松开了一个不错的功能,即两个十六进制数字恰好是一个字节,如果您查看内存内容,这将非常方便!同样,对于基数32,您仍然需要2位数字来表示一个字节可以具有的值。对于32位值,您只需要7位数字即可,而不是8位十六进制数字,但是对于以32位系统为基础的缺点而言,这并不是很多。
当今使用的不同数字表示系统为(=包括):
二进制,八进制,十进制和十六进制。
选择哪一个通常取决于手头任务的易用性。
二进制通常用于计算机系统和数字技术中,因为它很容易在电子产品中表示。基数为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(如果屏幕上显示其他内容)