2008-10-28 88 views
54

嘿!我一直在寻找这个代码在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进行比较?

为什么不只是使用数字? 任何人都可以请解释,并请举例说明其他情况。

此外,我已经看到了大量行代码,它只是十六进制数,从来没有真正明白为什么:(

回答

103

在你举两个例子中,数位模式是很重要的,而不是实际数量。

例如, 在第一种情况, j将是1,则2,4,8,16,32,64和最后128作为循环进行。

在二元的,即,

0000:00010000:00100000:0100,,0001:0000,0010:0000,0100:00001000:0000

有在C或C++二进制常量没办法,但它在十六进制更清楚一点: 0x010x020x040x080x100x200x400x80

在第二个示例中, 的目标是移除该值的较低两个字节。 因此,如果给定值1,234,567,890,我们最终将以1,234,567,168结束。
在十六进制中,它更清晰:从0x4996:02d2开始,以0x4996:0000结尾。

+2

对第二个例子的小修改:它删除了一个四字节数字的低两个字节。删除较低的四个字节将简单地为“small_n = 0;”。 – 2008-10-28 16:36:10

+3

D'Oh!你知道,我正在写“4位数字”和“两个字节”之间进行辩论,所以很自然地我把它们混合成了一个错误的陈述..... – 2008-10-28 17:18:16

17

它有点掩码。十六进制值可以很容易地看到底层的二进制表示。 n & 0xffff0000返回n的前16位。 0xffff0000表示“二进制16 1和16 0”

0x80表示“1000000”,所以以“00000001”开头并继续将该位移到左边的“0000010”,“0000100”等直到“1000000”

3

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

16

0xffff0000很容易理解,它是32位值的16倍“1”和16倍“0”,而4294901760是魔术。

6

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

这有时候可以处理特定值类型所提供的空间量,因此也可能发挥作用。

一个典型的例子可能在二进制设置,所以我们使用二进制代替使用十进制来显示一些值。

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

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

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

此外,有些人就是很舒服的十六进制。还要注意,硬编码的魔术数字就是这样,不管编号系统如何使用都不是那么重要

我希望有帮助。

1

看着文件,这是一些漂亮的代码。希望你擅长C而不是将它用作教程...

十六进制对于直接在比特级或正上方工作时很有用。例如,在一个驱动程序上工作,您可以直接从设备进入,并转换结果,以便其他人可以读取连贯的结果。这是一个非常容易阅读的二进制代码。

+1

这段代码没有错。看看这些代码,我找不到使用HEX的更清晰的方法。 – Kibbee 2008-10-28 17:31:46

17

在十六进制(或八进制数字)数字和底层位模式之间有一个直接映射,而小数不是这种情况。一个十进制的'9'表示与位模式有所不同,它取决于它所在的列和围绕它的数字 - 它与位模式没有直接关系。在十六进制中,'9'总是表示'1001',不管是哪一列。 9 ='1001',95 ='* 1001 * 0101'等等。

作为我8位天的遗迹,我发现十六进制对任何二进制文件都是一个方便的简写。位扭曲是一种垂死的技能。有一次(大约10年前),我在大学看到了第三年的网络论文,只有10%(五分之五)的同学可以计算出一个位掩码。

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 

你能看见吗?从十六进制传递到二进制更简单。

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) 

它偶尔取得了一定的位级码的可读性。

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... 
3

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

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

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

总体而言,基数的选择是一种让您的编程更轻松的方法 - 使用最适合该领域的方法。

3

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

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

为了理解简洁的重要性,考虑到在20世纪70年代,当你想检查你的兆字节的内存时,它被打印出十六进制。打印输出将使用几千页大纸。八月会浪费更多的树木。