为什么使用十六进制常量?

2022-08-31 15:19:51

有时我看到整数常量以十六进制而不是十进制数定义。这是我从GL10课程中学到的一小部分:

public static final int GL_STACK_UNDERFLOW = 0x0504;
public static final int GL_OUT_OF_MEMORY = 0x0505;
public static final int GL_EXP = 0x0800;
public static final int GL_EXP2 = 0x0801;
public static final int GL_FOG_DENSITY = 0x0B62;
public static final int GL_FOG_START = 0x0B63;
public static final int GL_FOG_END = 0x0B64;
public static final int GL_FOG_MODE = 0x0B65;

它显然比 定义更简单,所以是否有一些性能提升?我完全不这么认为,因为从那时起,编译器的工作应该是改变它。29140x0B62


答案 1

它可能是为了组织和视觉清洁。基数 16 与二进制的关系比以 10 为基数的关系简单得多,因为在以 16 为基数时,每个数字正好对应于四位。

请注意,在上面的常量中,常量如何与许多共同的数字分组。如果它们以十进制表示,则共同的位将不太清楚。如果它们具有共同的小数位数,则位模式将不具有相同的相似度。

此外,在许多情况下,希望能够按位 OR 常量组合在一起以创建标志组合。如果每个常量的值被约束为只有位的子集不为零,则可以以可以重新分离的方式完成此操作。使用十六进制常量可以清楚地了解每个值中哪些位不为零。

还有另外两种合理的可能性:八进制或以8为基数,每位数仅编码3位。然后是二进制编码的十进制,其中每个数字需要四位,但禁止超过9的数字值 - 这将是不利的,因为它不能代表二进制可以表达的所有可能性。


答案 2

“定义2914显然比0x0B62更简单”

我不知道那个具体案例,但通常情况并非如此。

在两个问题中:

  • A) 2914 的位值是多少?
  • B) 0x0B62的位值是多少?

B将被许多开发人员更快地回答得更正确。(这也适用于类似的问题)


0x0B62(长度为 4 个十六进制数字,因此它重新生成 16 位数字)

  • 0 的位 = 0000
  • B 的位 = 1011
  • 6 的位 = 0110
  • 2 的位 = 0010

->

0000101101100010

(我敢让你对2914做同样的事情。


这是使用十六进制值的一个原因,另一个原因是值的源可能使用十六进制(例如规范的标准)。

有时我只是觉得它很愚蠢,比如:

public static final int NUMBER_OF_TIMES_TO_ASK_FOR_CONFIRMATION = ...;

用十六进制写几乎总是愚蠢的,我相信在某些情况下它不会。