选择常量的值

pyt*_*ude 2 hex bit-manipulation constants

我从未真正理解的一件事是为什么在许多库中,常量定义如下:

public static final int DM_FILL_BACKGROUND = 0x2;
public static final int DM_FILL_PREVIOUS = 0x3;
public static final int TRANSPARENCY_MASK = 1 << 1;
public static final int TRANSPARENCY_PIXEL = 1 << 2;
Run Code Online (Sandbox Code Playgroud)

怎么了0x和<<东西?为什么人们不只是使用普通的整数值?

pax*_*blo 6

位移1通常适用于您要存储非独占值的情况.

例如,假设您希望能够在框的任何一侧绘制线条.你定义:

LEFT_SIDE   = 1 << 0  # binary 0001 (1)
RIGHT_SIDE  = 1 << 1  # binary 0010 (2)
TOP_SIDE    = 1 << 2  # binary 0100 (4)
BOTTOM_SIDE = 1 << 3  # binary 1000 (8)
                               ----
                               0111 (7) = LEFT_SIDE | RIGHT_SIDE | TOP_SIDE
Run Code Online (Sandbox Code Playgroud)

然后你可以将它们组合成多个方面:

DrawBox (LEFT_SIDE | RIGHT_SIDE | TOP_SIDE) # Don't draw line on bottom.
Run Code Online (Sandbox Code Playgroud)

他们使用完全不同的位这一事实意味着他们彼此独立.通过OR它们你得到1 | 2 | 4的等于7你可以用其他布尔运算检测每个单独的位(参见这里这里的解释).

如果他们被定义为1,2,3和4,那么你可能要么必须为每一方打一个电话,要么你必须传递四个不同的参数,每边一个.否则你无法分辨LEFT and RIGHT(1 + 2 = 3)和TOP(3)之间的区别,因为它们都是相同的值(使用简单的加法运算).

0x材料仅仅是十六进制数字,其更容易看到的二进制位掩码(每个十六进制数字正好与四个二进制数位对应,你会倾向于看到这样的图案0x01,0x02,0x04,0x08,0x10,0x20等等,因为他们的等价单1位朝向最显著比特位置移动-的那些值等同于二进制00000001,00000010,00000100,00001000,00010000,00100000等.

旁白:一旦你习惯了十六进制,你很少需要担心这些1 << n东西.您可以立即识别0x4000为二进制0100 0000 0000 0000.如果您在代码中看到值16384,那就不那么明显了,尽管我们中的一些人甚至认识 :-)