什么是十六进制?

什么是十六进制?

什么是十六进制?为什么它在计算中如此广泛使用?我知道计算机使用 0 和 1 来存储数据,那么我们为什么要使用十六进制呢?

答案1

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

人类主要使用十进制(十进制)系统,其中有 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 一样是 2 的幂,这使得逐位转换变得容易(参见此评论.因为有 16 个数字,所以其他数字都用字母表示。另外,十六进制通常以 0x 为前缀。

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

数数

在十进制中,我们有 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。有关计数的更多信息,请参见找到这里

下面是十进制、十六进制、八进制和二进制之间的转换图表: 十六进制换算表

答案2

什么是十六进制

十六进制系统是使用 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 个值,依此类推。十六进制使得使用称为十六进制转储因为字母、数字和标点符号的存储格式是将每个字符映射到 0 到 256 之间的数字(称为ASCII有时也使用其他编码)。此外,许多其他文件格式(如 PNG)都经过定制,使得文件所包含的每条信息都包含 256 位。

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

答案3

什么是十六进制?

假设有一个数字 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..11111111111111111111111111111111111
  • 八进制: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 进制呢?

32 进制是 2 的幂,这很棒。但是您需要 32 位数字,如 0..9、A..V。这需要记住更多的数字(您能轻松找出“S”会响应哪个数字吗?)。另一个警告是,使用 32 进制会失去两个十六进制数字正好是一个字节这一优点,如果您查看内存内容,这个优点就非常有用!此外,使用 32 进制时,您仍然需要 2 位数字来表示一个字节可以具有的值。对于 32 位值,您只需要 7 位数字,而不是 8 位十六进制数字,但这并不能完全消除 32 进制系统的缺点。

答案4

目前使用的不同数字表示系统包括:
二进制、八进制、十进制和十六进制。
选择哪一个通常取决于手头任务的易用性。

二进制用于计算机系统和一般数字技术中,因为它易于在电子设备中表示;二进制数的函数很容易构建,开/关、真/假或任何其他类似重复双状态信息的表示也很容易。

八进制如果有三个二进制数字组成,那就太好了,例如 Unix/Linux 中的权限设置的情况。

暂时跳过小数,十六进制与八进制类似,但适用于四个二进制数字,而且 8 位(一个字节)可以很好地容纳两个十六进制数字。(= 答案)
由此可见,计算机中的偶数 8 位组很容易写下来、表示和理解,也就是说,在日常编写软件、处理数据(例如 HTML/CSS 中的 rgb 颜色值)、形成数据结构和任何其他类似内容时非常方便。

十进制。人们可能猜测十进制是从我们有十个手指和脚趾这一事实发展而来的。一位数字代表计数的物品数量,每根手指一个,最多十个。


它们代表以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 位(一打)的时间系统(12 小时 =“10”以 12 为基数,第一个“小数”表示它是一小时的 1/12 [5 分钟])

注意:⁰¹²³ - 如果您的屏幕显示其他内容,请上标 0123

相关内容