代码之家  ›  专栏  ›  技术社区  ›  AntonioCS

为什么使用十六进制?

  •  57
  • AntonioCS  · 技术社区  · 16 年前

    嘿!我在看这个代码 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这个十六进制数。 所以在这行中,他们做了一点,并将结果与0进行比较??

    为什么不直接用这个号码? 有人能解释一下其他情况吗?

    此外,我还看到了大量的代码行,其中只包含十六进制数,而且从未真正理解为什么:(

    12 回复  |  直到 6 年前
        1
  •  105
  •   Suvarna Pattayil    11 年前

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

    例如, 在第一种情况下, 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 .

    在第二个示例中, 目标是删除值的下两个字节。 因此,假设值为1234567890,我们希望最终得到1234567168。
    在十六进制中,它更清晰:从 0x4996:02d2 结束 0x4996:0000 .

        2
  •  18
  •   ConcernedOfTunbridgeWells    11 年前

    十六进制(或八进制)数字和底层位模式之间有一个直接的映射,这与十进制不同。十进制“9”代表了与位模式不同的东西,这取决于它在哪一列中以及它周围的数字——它与位模式没有直接的关系。在十六进制中,“9”总是意味着“1001”,不管哪一列。9='1001',95='1001*0101'等等。

    作为我8位日子的痕迹,我发现十六进制是任何二进制文件的一个方便的缩写。一点点的旋转是一种临死的技能。有一次(大约10年前),我在大学里看到了一篇三年级的网络论文,在这篇论文中,只有10%(50%左右)的学生可以计算出一个小小的面具。

        3
  •  18
  •   Muzol    6 年前

    它有点像面具。十六进制值使查看底层二进制表示变得容易。N&P; 0xffff0000 返回n的前16位。 0xFFFFOW000 表示“二进制16 1s和16 0s”

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

        4
  •  16
  •   Michał Piaskowski    16 年前

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

        5
  •  10
  •   CompaniaHill    16 年前

    我发现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
  •  6
  •   Tim    16 年前

    有时,十六进制值的可视化表示使代码更易于阅读或理解。例如,当查看数字的十进制表示形式时,位屏蔽或位的使用变得不明显。

    这有时与特定值类型必须提供的空间量有关,因此也可能起到作用。

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

    假设一个对象有一个非独占的属性集,该属性集的值为on或off(其中3个),表示这些属性状态的一种方法是使用3位。

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

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

    另外,有些人对十六进制也很满意。还请注意,硬编码的幻数就是这样,不管使用什么编号系统,它都不是那么重要。

    希望有帮助。

        7
  •  6
  •   Lucas Gabriel Sánchez    16 年前

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

    OxFF = 1111 1111 ( F = 1111 )
    

    但是

    255 = 1111 1111 
    

    因为

    255 / 2 = 127 (rest 1)
    127 / 2 = 63 (rest 1)
    63 / 2 = 31 (rest 1)
    ... etc
    

    你看到了吗?从十六进制到二进制的传递要简单得多。

        8
  •  6
  •   mkClark    16 年前

    十六进制的最大用途可能是在嵌入式编程中。十六进制数用于屏蔽硬件寄存器中的单个位,或将多个数值打包到单个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...
    
        9
  •  4
  •   dongilmore    16 年前

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

    以256为底会更简洁。每个可能的字节都可以有自己的单个字符,但大多数人类语言不使用256个字符,因此十六进制是赢家。

    为了理解简洁的重要性,请考虑一下早在20世纪70年代,当您想检查您的兆字节内存时,它是以十六进制打印出来的。打印输出将使用几千页大纸张。八进制会浪费更多的树。

        10
  •  3
  •   Dan Hewett    16 年前

    更精确地说,十六进制和十进制都是数字。基数(以10、16等为基数)是以更清晰或更方便的方式表示这些数字的方法。

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

    十六进制(和八进制)具有二次幂的性质,因此它们可以很好地映射位的分组。十六进制将4位映射到一个十六进制半字节(0-f),因此一个字节存储在两个半字节(00-f f)中。八进制在数字设备(DEC)和其他老式机器上很流行,但是一个八进制数字映射到三位,所以它不能很好地跨越字节边界。

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

        11
  •  3
  •   paxdiablo    16 年前

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

        12
  •  2
  •   Paul Nathan    16 年前

    查看文件,这是一些相当糟糕的代码。希望你很擅长C,不要把它当作一个教程…

    十六进制在您直接在位级别或其上面工作时非常有用。例如,在一个驱动程序上工作,您可以直接查看从设备中输入的位,并旋转结果,以便其他人可以读取一致的结果。它是一个紧凑的、相当容易读取的二进制表示。