喂!我在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 ??
进行比较为什么不使用这个号码呢? 任何人都可以解释,并请举例说明其他情况。
此外,我已经看到大量的代码,它只是十六进制数字,从来没有真正理解为什么:(
答案 0 :(得分:105)
在这两种情况下,你引用的是,数字的位模式很重要,而不是实际数字。
例如,
在第一种情况下,
随着循环的进行,j
将是1,然后是2,4,8,16,32,64,最后是128。
二进制,即
0000:0001
,0000:0010
,0000:0100
,0000:1000
,0001:0000
,0010:0000
,0100:0000
和1000:0000
。
在C或C ++中没有二进制常量的选项,但在Hex中它更清晰一些:
0x01
,0x02
,0x04
,0x08
,0x10
,0x20
,0x40
和0x80
。< / 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而不是用它作为教程...
当您直接在位级别或其上方工作时,十六进制非常有用。例如,在一个驱动程序上工作,您可以直接查看来自设备的位并对结果进行调整,以便其他人可以读取连贯的结果。它是一个紧凑的,易于阅读的二进制表示。