嘿! 我在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进行比较?
为什么不直接使用这个号码呢?任何人都可以请解释,并请举例说明其他情况.
此外,我已经看到大行代码,它只是十六进制数字,从来没有真正理解为什么:(
在您引用的两种情况下,数字的位模式很重要,而不是实际数字.
例如,在第一种情况下,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++二进制常量没有选择,但它在十六进制是一个有点清晰:
0x01
,0x02
,0x04
,0x08
,0x10
,0x20
,0x40
,和0x80
.
在第二个示例中,目标是删除值的低两个字节.因此,给定值1,234,567,890,我们希望最终得到1,234,567,168.
在十六进制中,它更清楚:开始0x4996:02d2
,结束0x4996:0000
.
它有点面具.十六进制值使您可以轻松查看基础二进制表示.n&0xffff0000
返回n 的前16位.0xffff0000
表示"二进制16 1和16 0"
0x80
表示"1000000",因此您从"00000001"开始并继续将该位移到左侧"0000010","0000100"等,直到"1000000"
十六进制(或八进制)数字与基础位模式之间存在直接映射,而小数则不是这种情况.十进制"9"表示与位模式不同的内容,具体取决于它所在的列以及它周围的数字 - 它与位模式没有直接关系.在十六进制中,无论哪一列,'9'始终表示'1001'.9 ='1001',95 ='*1001*0101'等等.
作为我8位日的遗迹,我发现十六进制是任何二进制的便捷速记.比特蹒跚是一种垂死的技能.曾经(大约10年前)我在大学看到了第三年的网络论文,其中只有10%(50个左右中的5个)的人可以计算出一个比特掩码.
0xffff0000很容易理解,它在32位值中是16倍"1"和16倍"0",而4294901760是神奇的.
我发现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)
它偶尔会使某些位级代码更具可读性.
十六进制的最大用途可能是嵌入式编程.十六进制数用于屏蔽硬件寄存器中的各个位,或者将多个数值分组到一个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...
有时,HEX中值的可视化表示使代码更易读或易懂.例如,当查看数字的十进制表示时,位掩码或位的使用变得不明显.
这有时会对特定值类型提供的空间量有所影响,因此也可能起作用.
典型示例可能是二进制设置,因此我们使用二进制代替使用十进制来显示某些值.
假设一个对象有一组非排他性的属性,其值为on或off(其中3个) - 表示这些属性状态的一种方法是3位.
有效的表示形式是十进制的0到7,但这不是那么明显.更明显的是二进制表示:
000,001,010,011,100,101,110,111
另外,有些人对十六进制非常熟悉.另请注意,硬编码的幻数就是这样,无论使用编号系统,它都不是那么重要
我希望有所帮助.
通常使用十六进制数而不是十进制数是因为计算机使用位(二进制数),当您使用位时,使用十六进制数也更容易理解,因为从十六进制到二进制更容易从十六进制到二进制.
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传递到二进制文件要简单得多.