当前位置:  开发笔记 > 编程语言 > 正文

为何使用hex?

如何解决《为何使用hex?》经验,为你挑选了8个好方法。

嘿! 我在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进行比较?

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

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



1> James Curran..:

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

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

在二进制中,即

0000:0001,0000:0010,0000:0100,0000:1000,0001:0000,0010:0000,0100:00001000:0000.

有在C或C++二进制常量没有选择,但它在十六进制是一个有点清晰: 0x01,0x02,0x04,0x08,0x10,0x20,0x40,和0x80.

在第二个示例中,目标是删除值的低两个字节.因此,给定值1,234,567,890,我们希望最终得到1,234,567,168.
在十六进制中,它更清楚:开始0x4996:02d2,结束0x4996:0000.


D'哦!我知道,我在写"4位数字"和"两个字节"之间进行辩论,所以很自然地我把它们混为一个错误的陈述.....
第二个示例的小修正:它删除了四个字节数的低两个字节.删除低四个字节只是"small_n = 0;".

2> Jimmy..:

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

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



3> ConcernedOfT..:

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

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



4> Michał Piask..:

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



5> 小智..:

我发现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)

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


回复:"我一直希望他们能为二进制添加直接支持" - 一些编译器确实将其作为扩展实现:我在各种PIC C编译器中看到它,通常类似于"0b10110110"

6> mkClark..:

十六进制的最大用途可能是嵌入式编程.十六进制数用于屏蔽硬件寄存器中的各个位,或者将多个数值分组到一个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...



7> Tim..:

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

这有时会对特定值类型提供的空间量有所影响,因此也可能起作用.

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

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

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

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

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

我希望有所帮助.



8> Lucas Gabrie..:

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

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传递到二进制文件要简单得多.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有