2014-09-03 89 views
6

我看了一下为什么我们有时使用十进制的十六进制格式?

int a = 0x1; //hexadecimal format 

但是,我找不到为什么程序员应该使用为0x1的原因,0X2而不是纯整数1或2的解释......

可有人请解释一下?

谢谢。

+0

这样的数字可能更具逻辑意义(例如'0x0001,0x0010,0x0100,0x1000'而不是'1,16,256,4096')。它也常用于颜色和错误代码。 – Obicere 2014-09-03 03:53:16

+0

我相信这是我回答的问题的重复,[这里](http://stackoverflow.com/questions/18304564/what-does-this-line-of-code-do-const-uint32-t -goodguys-0x1-0/18317401#18317401)。 – Jashaszun 2014-09-03 03:53:21

+0

@Jashaszun虽然问题材料是相关的,但我觉得这个问题是针对十六进制格式的广泛使用,而你所链接的问题更多地集中在一个特定的情况。尽管如此,我相信你的答案确实能够解决这个问题。 – Vulcan 2014-09-03 04:04:17

回答

2

实际上没有什么区别。我认为这是基于一致性的考虑。例如,您要指定一些颜色,如0xffffff,0xab32,0x13和0x1,这些颜色一致且易于阅读。

+0

以十六进制表示的颜色确实比以小数表示的+1好得多。 – Vulcan 2014-09-03 03:55:49

4

我使用过自己的一个原因是,它涉及到标志时,它在组织上/视觉上(即,在将代码放在代码中时对人有帮助)。

int a = 0x1; 
int b = 0x2; 
int c = 0x4; 
int d = 0x8; 
int e = 0x10; 

等。那些可以更整齐地按位“或”运算。例如,上述所有按位“或”都是0X1F,即二进制中的11111或单独的二进制字段。

然后,如果我想删除一个标志我按位 - 异或它了。

0x1F的XOR位于0x8 = 10111

+0

我相信你的意思是0x10为0x16?而0x16异或0x8不会删除任何位,因为它们没有共同的位。 – user949300 2014-09-03 04:00:26

+0

@ user949300:是的,谢谢。 – khampson 2014-09-03 04:01:36

4

有许多的原因之一宁愿十六进制表示在十进制之一。计算中最常见的是bit fields。有几个人已经提到的颜色代码,如:

red = 0xFF0000 // 16711680 in decimal 
green = 0x00FF00 // 65280 in decimal 
blue = 0x0000FF // 255 in decimal 

注意颜色的这种表现不仅比试图找出像213545的随机整数可能是什么颜色更加直观,而且还占用更少的空间比像(125, 255, 0)这样的3元组代表(R,G,B)。十六进制表示法是一种简单的方法,它可以抽象出与三元组相同的想法,并且开销较小。

记住位域有很多应用,考虑spacetime位字段:

Represents x coordinate 
    | Represents y coordinate 
    | | Represents z coordinate 
    | | | Represents t 
    | | | | 
    1A 2B 3C 4D 

为什么有人可能会使用十六进制值的另一个原因是因为它有时更容易记住(并代表)的二进制位数为两个符号而不是三个。考虑x86 Instruction Reference。我知道我的头顶那0xC3ret;我发现很容易记住十六进制数00-FF而不是小数点0-255(我查了一下,并且ret最后是195),但是你的里程可能会有所不同。例如,这是一些代码from a project我一直在努力:

public class x64OpcodeMapping { 
    public static final Object[][] map = new Object[][] { 
      { "ret", 0xC3 }, 
      { "iret", 0xCF }, 
      { "iretd", 0xCF }, 
      { "iretq", 0xCF }, 
      { "nop" , 0x90 }, 
      { "inc" , 0xFF }, 
    }; 
} 

有明显的好处在这里使用十六进制符号时(更不用说一致性)。最后,正如Obicere所说,十六进制代码通常用作错误代码。有时候他们有点像田野般的方式。例如:

0x0X = fatal errors 
0x1X = user errors 
0x2X = transaction errors 
// ... 
// X is a wildcard 

在这样一个模式,一个最小的错误列表看起来像:

0x00 = reserved 
0x01 = hash mismatch 
0x02 = broken pipe 
0x10 = user not found 
0x11 = user password invalid 
0x20 = payment method invalid 
// ... 

注意,这也让我们0x0X下添加新的错误,如果这种需要就会出现。这个答案最终比我预期的时间长得多,但希望我可以点亮一些。