为何使用hex?

时间:2008-10-28 15:22:32

标签: c++ c hex

喂!我在http://www.gnu.org/software/m68hc11/examples/primes_8c-source.html

看了这段代码

我注意到在某些情况下他们使用十六进制数字,如第134行所示:

for (j = 1; val && j <= 0x80; j <<= 1, q++)

现在他们为什么要使用0x80?我对十六进制没有那么好,但我发现一个在线十六进制到十进制,它给了我128为0x80。

同样在134行之前,在第114行他们有:

small_n = (n & 0xffff0000) == 0;

十六进制到十进制给了我这个十六进制数字的4294901760。 所以在这一行中他们做了一点AND并将结果与​​0 ??

进行比较

为什么不使用这个号码呢? 任何人都可以解释,并请举例说明其他情况。

此外,我已经看到大量的代码,它只是十六进制数字,从来没有真正理解为什么:(

12 个答案:

答案 0 :(得分:105)

在这两种情况下,你引用的是,数字的位模式很重要,而不是实际数字。

例如, 在第一种情况下, 随着循环的进行,j将是1,然后是2,4,8,16,32,64,最后是128。

二进制,即

0000:00010000:00100000:01000000:10000001:00000010:00000100:00001000:0000

在C或C ++中没有二进制常量的选项,但在Hex中它更清晰一些: 0x010x020x040x080x100x200x400x80。< / p>

在第二个例子中, 目标是删除值的低两个字节。 因此,如果值为1,234,567,890,我们希望得到1,234,567,168 在十六进制中,它更清楚:从0x4996:02d2开始,以0x4996:0000结束。

答案 1 :(得分:18)

它有点面具。十六进制值使您可以轻松查看基础二进制表示。 n&amp; 0xffff0000返回n的前16位。 0xffff0000表示“二进制16 1和16 0”

0x80表示“1000000”,因此您从“00000001”开始并继续将该位移至左侧“0000010”,“0000100”等,直至“1000000”

答案 2 :(得分:18)

十六进制(或八进制)数字与基础位模式之间存在直接映射,而小数则不是这种情况。十进制“9”表示与位模式不同的内容,具体取决于它所在的列以及它周围的数字 - 它与位模式没有直接关系。在十六进制中,无论哪一列,'9'始终表示'1001'。 9 ='1001',95 ='* 1001 * 0101'等等。

作为我8位日的痕迹,我发现hex是任何二进制文件的便捷速记。比特蹒跚是一种垂死的技能。曾经(大约10年前)我在大学看到了第三年的网络论文,其中只有10%(50人中有5人)可以计算出一个比特掩码。

答案 3 :(得分:16)

0xffff0000很容易理解它在32位值中是16倍“1”和16倍“0”,而4294901760是神奇的。

答案 4 :(得分:10)

我发现C系列语言总是支持八进制和十六进制而不是二进制,这让我感到很疯狂。我一直希望他们能为二进制文件添加直接支持:

int mask = 0b00001111;

许多年/工作之前,在处理涉及大量位级数学的项目时,我厌倦了并生成了一个头文件,其中包含了最多8位的所有可能二进制值的已定义常量:

#define b0        (0x00)
#define b1        (0x01)
#define b00       (0x00)
#define b01       (0x01)
#define b10       (0x02)
#define b11       (0x03)
#define b000      (0x00)
#define b001      (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)

偶尔会使某些位级代码更具可读性。

答案 5 :(得分:6)

有时,HEX中值的可视化表示使代码更易读或易懂。例如,当查看数字的十进制表示时,位掩码或位的使用变得不明显。

这有时会影响特定值类型提供的空间量,因此也可能发挥作用。

典型示例可能是二进制设置,因此我们使用二进制代替使用十进制来显示某些值。

假设一个对象有一组非排他性属性,其值为on或off(其中3个) - 表示这些属性状态的一种方法是3位。

有效的表示形式是十进制的0到7,但这不是那么明显。更明显的是二进制表示:

000,001,010,011,100,101,110,111

另外,有些人对十六进制非常熟悉。另请注意,硬编码的魔术数字就是这样,无论编号系统如何使用都不是那么重要

我希望有所帮助。

答案 6 :(得分:6)

通常使用十六进制数而不是十进制数是因为计算机使用位(二进制数),当您使用位时,使用十六进制数也更容易理解,因为更容易从十六进制到二进制来自十进制到二进制。

OxFF = 1111 1111 ( F = 1111 )

但是

255 = 1111 1111 

因为

255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc
你能看到吗?从Hex传递到二进制文件要简单得多。

答案 7 :(得分:6)

十六进制的最大用途可能是嵌入式编程。十六进制数用于屏蔽硬件寄存器中的各个位,或者将多个数值分组到一个8位,16位或32位寄存器中。

当指定单个位掩码时,很多人都是从:

开始
#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...

过了一会儿,他们前进到:

#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...

然后他们学会作弊,让编译器在编译时优化过程中生成值:

#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...

答案 8 :(得分:4)

一个字节有8位。十六进制,底座16,简洁。任何可能的字节值都使用集合0..9中的两个字符加上a,b,c,d,e,f来表示。

Base 256会更简洁。每个可能的字节都可以有自己的单个字符,但大多数人类语言不使用256个字符,因此Hex是胜利者。

要理解简洁的重要性,请考虑一下在1970年代,当你想检查你的兆字节内存时,它是以十六进制打印出来的。打印输出将使用数千页的大纸。 Octal会浪费更多的树木。

答案 9 :(得分:3)

十六进制或十六进制数字表示4位数据,0到15或HEX 0到F.两个十六进制值表示一个字节。

答案 10 :(得分:3)

更准确地说,十六进制和十进制都是NUMBERS。基数(基数10,16等)是以更清晰或更方便的方式呈现这些数字的方法。

在讨论“有多少东西”时,我们通常使用小数。当我们查看计算机上的地址或位模式时,通常首选十六进制,因为通常单个字节的含义可能很重要。

十六进制,(和八进制)具有它们是2的幂的属性,因此它们很好地映射了位的分组。十六进制将4位映射到一个十六进制半字节(0-F),因此一个字节存储在两个半字节(00-FF)中。 Octal在数字设备(DEC)和其他旧机器上很受欢迎,但是一个八进制数字映射到三位,所以它不会很好地跨越字节边界。

总的来说,基数的选择是一种让您的编程更容易的方法 - 使用与域名最匹配的方法。

答案 11 :(得分:2)

查看文件,这是一些相当高的代码。希望你擅长C而不是用它作为教程...

当您直接在位级别或其上方工作时,十六进制非常有用。例如,在一个驱动程序上工作,您可以直接查看来自设备的位并对结果进行调整,以便其他人可以读取连贯的结果。它是一个紧凑的,易于阅读的二进制表示。